morning-briefing

安装量: 44
排名: #16616

安装

npx skills add https://github.com/krishagel/geoffrey --skill morning-briefing
Morning Briefing Workflow
Overview
Generates a daily morning briefing and delivers it three ways:
Terminal
Summary displayed immediately
Obsidian
Full briefing saved to daily note
Email
Briefing text + audio podcast attachment
Location
Gig Harbor, WA
- Use for weather queries
Phase 1: Gather Data
Execute these data gathering steps:
1.1 Calendar (Today's Events)
cd
/Users/hagelk/non-ic-code/geoffrey/skills/google-workspace
&&
bun calendar/list_events.js psd
--today
Returns JSON with today's events including:
Event summary, location, start/end times
Attendees and response status
Hangout/meet links
Account
Use psd for work calendar 1.2 OmniFocus Tasks (Due & Flagged) osascript -l JavaScript /Users/hagelk/non-ic-code/geoffrey/skills/morning-briefing/scripts/get_due_flagged.js Returns tasks that are: Due today or overdue Flagged Available (not blocked, not deferred to future) 1.3 Recent Emails (Last 24 Hours)

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:
From, subject, date, snippet
Whether read or unread
Thread ID for context
Labels array
Filtering
Only show emails still in inbox (not already labeled/processed).
Emails with custom labels (Label_XXXXX) have been sorted and should be excluded
Exception: Include emails with SaneCC or SaneLater labels (worth knowing about)
System labels (UNREAD, INBOX, CATEGORY_*, IMPORTANT) don't count as "processed"
Philosophy
Any email still in inbox from last 24 hours needs attention, read or not.
Account
Use
psd
for work email
1.4 Open Freshservice Tickets
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.
1.5 Pending Approvals
bun /Users/hagelk/non-ic-code/geoffrey/skills/freshservice-manager/scripts/get_approvals.js requested
Returns service requests awaiting approval.
1.6 Weather
Use WebSearch:
Gig Harbor WA weather today forecast
Extract:
Current conditions
High/low temperature
Precipitation chance
Any alerts
1.7 EdTech News (with Synopses)
Use WebSearch:
K-12 education technology news past 24 hours January 2026
For each article found (3-5 articles):
Use WebFetch to read the full article
Extract a 2-3 sentence synopsis covering:
What happened / what's new
Why it matters for K-12 education
Key takeaway or action item
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:
EdTech product launches and updates
School technology policy changes
Cybersecurity in schools
Digital learning trends
1.8 AI News (with Synopses)
Use WebSearch:
artificial intelligence news past 24 hours January 2026 latest
For each article found (3-5 articles):
Use WebFetch to read the full article
Extract a 2-3 sentence synopsis covering:
What's the development
Industry impact
Relevance to education/work
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:
Major AI model releases and capabilities
AI policy and regulation
Enterprise AI adoption
AI research breakthroughs
1.9 K-12 Leadership News (with Synopses)
Use WebSearch:
K-12 school leadership superintendent news past 24 hours January 2026
For each article found (2-3 articles):
Use WebFetch to read the full article
Extract a 2-3 sentence synopsis covering:
Policy or leadership development
Impact on districts/schools
Relevance to CIO/technology leadership
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:
State and federal education policy
Superintendent and board news
School funding and budgets
Workforce and staffing trends
1.9b School Safety & Security News (with Synopses)
Use WebSearch:
K-12 school safety security news past 24 hours January 2026
For each article found (3 articles):
Use WebFetch to read the full article
Extract a 2-3 sentence synopsis covering:
What happened / what's new
Impact on school safety practices
Key takeaway for districts
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:
School security incidents and responses
Safety policy changes
Emergency preparedness
Mental health and threat assessment
Physical security technology
1.10 Technology Team EOD Messages (Last Business Day) - DETAILED
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:
ONLY use names that appear in the
sender
field of the script output
If script returns no messages, say "No EOD messages found"
If script returns messages with sender IDs instead of names, display the ID (e.g., "users/12345...")
NEVER invent names, locations, or accomplishments
Copy-paste approach: treat script output as source of truth
Before extracting team data:
Examine the raw JSON output from the script
List the exact
sender
values returned
Use ONLY those names - no paraphrasing, no "improving"
CRITICAL
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:
Name
Who posted (use EXACTLY the name from
sender
field)
Location(s)
Where they worked (WFH, DCRC, school sites)
Key accomplishments
Specific tasks completed (not just "tickets")
Notable items
Interesting problems solved, projects worked on
Issues/blockers
Any problems mentioned
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).
1.10b Safety & Security Team EOD Messages (Last Business Day)
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:
ONLY use names that appear in the
sender
field of the script output
If script returns no messages, say "No EOD messages found"
If script returns messages with sender IDs (e.g., "users/12345...") instead of names:
Display as:
Unknown (users/123456...)
- [Location from message content]
Add note: "Name not in mapping - update chat_user_mapping.json"
NEVER invent names, locations, or accomplishments
Copy-paste approach: treat script output as source of truth
Before extracting team data:
Examine the raw JSON output from the script
List the exact
sender
values returned
Use ONLY those names - no paraphrasing, no "improving"
Extract 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). 1.11 Team Completed Tickets (Last Business Day) 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:
ONLY use agent names that appear in the
byAgent
section of script output
Use EXACTLY the ticket counts returned by the script
NEVER invent names or ticket counts
If an agent's name shows as ID or email, display it as-is
Before reporting ticket stats:
Examine the raw JSON output from
get_daily_summary.js
List the exact agent names from
byAgent
field
Use ONLY those names and counts
Returns:
Total tickets closed
Breakdown by agent
Breakdown by category (Password Reset, Chromebook, etc.)
Automated vs agent-resolved
Workspace
Technology (workspace_id: 2) 1.12 Ticket Trends Analysis 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:
Volume trends (increasing/decreasing)
Category spikes (sudden increase in specific issue types)
Agent workload distribution
Unusual patterns
1.13 Software Development Workspace Tickets
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. 1.14 Legislative Activity (Last Business Day) 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:
Date range to check (last business day → today)
List of ~143 confirmed education bill IDs
WebFetch instructions for each bill
Workflow:
Get the output from
get_recent_bill_activity.js
WebFetch each bill URL (batch 5-6 in parallel for speed)
Extract latest action date from each bill page
Filter to bills where latest_action_date >= lookback_start
Apply priority framework (HIGH/MEDIUM/LOW based on district impact)
Include summary of what each bill does
On 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=2025
https://app.leg.wa.gov/billsummary?BillNumber=5038&Year=2025
Note
Only include bills that actually had activity. If no bills moved, output "No legislative activity since [date]".
Phase 2: Generate Briefing
2.1 Analyze & Prioritize
Review gathered data and identify:
Conflicts
Overlapping calendar events
Urgencies
Overdue tasks, high-priority tickets
Themes
Patterns across data sources 2.2 Format Markdown Briefing 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) |

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 Generate Podcast Script (Extended Format)
Transform the briefing into a comprehensive conversational audio script:
First person, casual professional tone
10-15 minutes speaking time (~1500-2000 words)
Address listener directly ("Here's what you need to know today...")
Required Sections (in order):
Opening
(~100 words)
Day, date, weather summary
Quick preview of key items
Calendar & Schedule
(~150 words)
Today's events with context
Highlight key meetings/events
Note any conflicts or prep needed
Tasks & Priorities
(~150 words)
Overdue items that need attention
Due today items
Flagged priorities
Tickets & Service Desk
(~150 words)
Open Technology tickets
Software Development tickets
Pending approvals
Team Activity - DETAILED
(~400 words)
What the Technology team accomplished on last business day
Highlight 3-5 team members by name with specifics
Notable projects, interesting problems solved
What the Safety & Security team accomplished
Overall ticket closure stats
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
EdTech News
(~200 words)
2-3 articles with synopses
Why each matters for K-12
AI News
(~200 words)
2-3 articles with synopses
Industry impact and relevance
K-12 Leadership News
(~150 words)
1-2 articles with synopses
Policy/leadership implications
8b.
School Safety & Security News
(~150 words)
2-3 articles with synopses
Safety practices and district implications
Legislative Update
(~150 words)
Bills that had hearings, votes, or readings since last business day
Highlight any with direct district impact (fiscal, operational, staffing)
Note upcoming hearing dates if relevant
On Mondays, include weekend activity summary
Closing
(~100 words)
Top 3 priorities for the day
Sign off
Style Guidelines:
Use team members' first names when discussing their work
Include specific details (not "worked on tickets" but "resolved 34 Chromebook repairs")
Transition smoothly between sections
Add brief commentary/analysis on news items
Save to
/tmp/morning_briefing_podcast.txt
Phase 3: Create Podcast
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 Phase 3.5: Generate Infographic (MANDATORY) CRITICAL: The infographic MUST be generated. Do not skip this phase. Create a visual summary infographic using the image-gen skill. 3.5.1 Build Infographic Prompt 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" 3.5.2 Generate Image 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: Aspect ratio: 16:9 (landscape dashboard) Size: 2K (ensures text readability) Output: ~/Desktop/morning_briefing_[DATE].png Phase 4: Save to Obsidian 4.1 Copy Infographic to Obsidian Assets cp ~/Desktop/morning_briefing_ [ DATE ] .png \ ~/Library/Mobile \ Documents/iCloud~md~obsidian/Documents/Personal_Notes/Geoffrey/Daily \ Briefings/assets/ 4.2 Add Infographic to Briefing Markdown At the top of the briefing (after the title), add: ! Daily Briefing Infographic 4.3 Save Briefing File 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 Phase 5: Send Email (HTML with Inline Infographic) 5.1 Generate HTML Email Body 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 : 600 px ; margin : 0 auto ; } .header { text-align : center ; border-bottom : 2 px solid

003366

; padding : 16 px ; } .stat-box { background :

f8f9fa

; padding : 12 px ; text-align : center ; } / ... more styles from template ... / </ style

</ head

< body

< img src = " cid:briefing_image " alt = " Daily Briefing " style = " width : 100 % ; max-width : 600 px ; border-radius : 8 px ; margin-bottom : 20 px ; "

< div class = " header "

< h1 style = " color :

003366

; "

Daily Briefing </ h1

< p

[DAY_OF_WEEK], [DATE_FORMATTED] </ p

</ div

< div style = " background :

e8f4f8

; padding : 16 px ; border-radius : 8 px ; margin-top : 20 px ; "

< strong

Attachments: </ strong

< br

🎧 Audio Podcast (~10-15 min) < br

📊 Infographic (also shown above) </ div

< p style = " text-align : center ; color :

666

; font-size : 12 px ; "

Full briefing: Obsidian/Geoffrey/Daily Briefings/[DATE].md </ p

</ body

</ html

CRITICAL: The displays the infographic inline at the top of the email. Save to /tmp/morning_briefing_email.html 5.2 Send with Inline Image + Attachments 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: Infographic displays INLINE at top of email (visible without downloading) Podcast attached for download Email renders nicely in Gmail with professional styling Output 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]
Error Handling
Missing Google Workspace Scripts
If calendar/email scripts don't exist:
Skip those sections
Note "Integration pending" in output
Continue with available data sources
OmniFocus Not Running
Status: Partial
Note: OmniFocus not running - task data unavailable
Freshservice API Error
Status: Partial
Note: Freshservice API error - ticket data unavailable
Local TTS Generation Failed
Status: Partial
Note: Audio generation failed - check mlx-audio setup
Briefing saved to Obsidian without podcast
Dependencies
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
Configuration
User Preferences
Location
Gig Harbor, WA (weather)
Work Email
psd account
Technology Workspace
workspace_id: 2
Software Dev Workspace
workspace_id: 13
Technology Chat Space
spaces/AAAAxOtpv10 (Technology Staff Check-Ins & Logs)
Safety & Security Chat Space
spaces/AAAAFpQaAnA (PSD Safety & Security Team)
Voice
af_heart (warm, friendly - local Kokoro TTS)
Podcast Length
10-15 minutes (~1500-2000 words) Customization Users can request: "Skip news" - omit news section "No podcast" - text only "Just calendar and tasks" - minimal briefing
返回排行榜