| name | morning-brief |
| description | Produce the user's daily morning briefing โ a single combined markdown report covering stock prices and trends for their tracked tickers, plus the day's top trending tech news. This skill orchestrates other section skills (currently stocks-daily and tech-trends-daily) and concatenates their output into one brief. Use this whenever the user asks for "morning brief", "daily brief", "give me my brief", "what's the news", "morning update", "what should I know today", or invokes `/morning-brief`. Trigger this skill even when the user does not explicitly mention "brief" โ phrases like "good morning, what's going on", "catch me up", or "fire up the morning routine" should all invoke it. New sections (weather, crypto, calendar, etc.) will be added to the section list below as they're built โ when the brief runs, it includes every section currently listed. |
morning-brief
A composer skill. It does not own any data-fetching logic of its own โ it runs each section's existing fetcher script, formats the results, and assembles them into one report.
Sections (in display order)
| # | Section title | Fetcher | Lives in |
|---|
| 1 | ๐ Markets | python3 .claude/skills/stocks-daily/scripts/fetch_stocks.py | stocks-daily |
| 2 | ๐ Tech Trends (last 24h) | python3 .claude/skills/tech-trends-daily/scripts/fetch_trends.py --window 24h | tech-trends-daily |
When new section skills exist, add a row here and a render block below. The orchestration logic does not change.
Workflow
1. Run all section fetchers in parallel
Launch the section scripts as background shell jobs and wait, so a slow source on one side doesn't block the other:
python3 .claude/skills/stocks-daily/scripts/fetch_stocks.py > /tmp/morning-brief-stocks.json 2>/tmp/morning-brief-stocks.err &
PID_STOCKS=$!
python3 .claude/skills/tech-trends-daily/scripts/fetch_trends.py --window 24h > /tmp/morning-brief-trends.json 2>/tmp/morning-brief-trends.err &
PID_TRENDS=$!
wait $PID_STOCKS $PID_TRENDS
If a fetcher exits non-zero, capture that fact and continue โ render an apologetic placeholder for that section rather than failing the whole brief. Stale data โซ no brief.
2. Render each section
For each section that returned data, render using the section skill's template (don't reinvent โ those templates are owned by their skill). Skim the section skill's SKILL.md if you need to recall the exact format:
- Markets: compact table per the format in stocks-daily/SKILL.md
- Tech Trends: numbered list per the format in tech-trends-daily/SKILL.md โ but trim to the top 5 stories for the brief (the standalone trends skill shows up to 8). The brief is a glanceable summary; deeper reading happens in the dated trend file.
3. Assemble into the brief
# Morning Brief โ {YYYY-MM-DD}
_Generated {ISO timestamp} UTC_
## ๐ Markets
{rendered stocks table}
## ๐ Tech Trends (last 24h)
{rendered top-5 trends list}
---
{if any section had source errors: 'โ ๏ธ Section notes: ' + brief description}
Use the date from whichever section ran first; both should agree (same UTC day).
4. Save + print
Write the assembled markdown to:
output/morning-brief/{YYYY-MM-DD}.md
Path is relative to the project root. Overwrite if exists โ latest run is canonical.
Print the same content to chat. End with one line:
Saved to output/morning-brief/{YYYY-MM-DD}.md
What this skill explicitly does NOT do
- Doesn't save individual section files. When the user invokes
/morning-brief, only output/morning-brief/{date}.md is written. The standalone section skills (/stocks-daily, /tech-trends-daily) do save their own dated files when invoked directly โ that's their job, not this composer's.
- Doesn't duplicate fetching logic. All HTTP, parsing, and ranking lives in section-skill scripts. If you find yourself wanting to add a new HTTP call here, that's a signal to either extend an existing section skill or create a new one.
- Doesn't transform section JSON beyond minor trimming (e.g., showing top 5 instead of top 8 trends). If section formatting needs to change, change it in the section skill so the standalone invocation reflects it too.
Adding a new section later
- Build the new section skill (e.g.,
weather-daily/, crypto-daily/) with its own SKILL.md, fetcher script, references โ same structure as the existing two.
- Add a row to the Sections table above.
- Add a fetcher line to the parallel-launch block in step 1 of the workflow.
- Add a render block reference in step 2.
- Add a
## emoji Section title block to the assembly template in step 3.
That's it โ no orchestration changes needed.