daily-briefing-builder
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDaily Briefing Builder
每日简报生成器
Generates a morning brief from your Obsidian vault. Reads today's action file, scans for unposted content, and fetches weather — all inside a Claude Code session.
No APIs. No paid services. No agent autonomy required. You run it, you get your brief.
从你的Obsidian vault生成晨间简报。读取今日行动文件、扫描未发布内容并获取天气——所有操作都在Claude Code会话内完成。
无需API、无需付费服务、无需Agent自治。你运行它,就能获取专属简报。
How to Use
使用方法
Open Claude Code in your vault directory and say:
Run the Daily Briefing Builder skill.Or with context upfront:
Run the Daily Briefing Builder skill. My vault is at /path/to/vault and my city is Ann+Arbor.在你的vault目录下打开Claude Code,输入:
Run the Daily Briefing Builder skill.或者预先提供上下文:
Run the Daily Briefing Builder skill. My vault is at /path/to/vault and my city is Ann+Arbor.Skill Instructions (for Claude Code)
技能说明(适用于Claude Code)
When this skill is invoked, follow these phases exactly.
调用该技能时,请严格遵循以下阶段执行。
PHASE 1: INTAKE
阶段1:信息收集
Check whether the user has provided:
- — absolute path to their Obsidian vault
vault_path - — city name for weather (wttr.in format, spaces as
city)+
If either is missing, ask before proceeding:
To run your morning brief, I need two things:
1. Your vault path (e.g. /root/obsidian-vault)
2. Your city for weather (e.g. Ann+Arbor or London)Do not proceed to PHASE 2 until both values are confirmed.
检查用户是否提供了以下参数:
- — Obsidian vault的绝对路径
vault_path - — 获取天气的城市名称(wttr.in格式,空格用
city代替)+
如果任一参数缺失,请先询问用户再继续:
To run your morning brief, I need two things:
1. Your vault path (e.g. /root/obsidian-vault)
2. Your city for weather (e.g. Ann+Arbor or London)在确认两个参数都获取到之前,不要进入阶段2。
PHASE 2: ANALYZE
阶段2:分析处理
Run these shell commands in sequence. Capture all output before formatting.
Step 1 — Today's actions:
bash
TODAY=$(date +%Y-%m-%d)
VAULT="VAULT_PATH_HERE"
ACTIONS_FILE="$VAULT/bambf/tracking/daily-actions/${TODAY}.md"
if [ -f "$ACTIONS_FILE" ]; then
echo "FILE_FOUND"
awk '/## Today.s 3 Actions/{found=1; next} found && /^[0-9]/{print} found && /^##/{exit}' "$ACTIONS_FILE"
else
echo "FILE_MISSING:$ACTIONS_FILE"
fiStep 2 — Unposted content scan:
bash
VAULT="VAULT_PATH_HERE"
READY_DIR="$VAULT/content/ready-to-post"
if [ -d "$READY_DIR" ]; then
find "$READY_DIR" -name "*.md" -printf "%T@ %p\n" 2>/dev/null \
| sort -rn | awk '{print $2}' \
| while read f; do
if grep -q '\*\*Posted:\*\* ❌' "$f" 2>/dev/null; then
platform=$(echo "$f" | sed "s|.*/ready-to-post/||" | cut -d'/' -f1)
title=$(grep -m1 '^[^#\-\*>|` ]' "$f" 2>/dev/null | head -c 100)
rel="${f##$VAULT/}"
echo "ITEM|$platform|$rel|$title"
fi
done
else
echo "DIR_MISSING:$READY_DIR"
fiStep 3 — Weather:
bash
curl -s --max-time 5 "wttr.in/CITY_HERE?format=3" || echo "WEATHER_UNAVAILABLE"按顺序运行以下shell命令,格式化前先捕获所有输出。
步骤1 — 获取今日行动事项:
bash
TODAY=$(date +%Y-%m-%d)
VAULT="VAULT_PATH_HERE"
ACTIONS_FILE="$VAULT/bambf/tracking/daily-actions/${TODAY}.md"
if [ -f "$ACTIONS_FILE" ]; then
echo "FILE_FOUND"
awk '/## Today.s 3 Actions/{found=1; next} found && /^[0-9]/{print} found && /^##/{exit}' "$ACTIONS_FILE"
else
echo "FILE_MISSING:$ACTIONS_FILE"
fi步骤2 — 扫描未发布内容:
bash
VAULT="VAULT_PATH_HERE"
READY_DIR="$VAULT/content/ready-to-post"
if [ -d "$READY_DIR" ]; then
find "$READY_DIR" -name "*.md" -printf "%T@ %p\n" 2>/dev/null \
| sort -rn | awk '{print $2}' \
| while read f; do
if grep -q '\*\*Posted:\*\* ❌' "$f" 2>/dev/null; then
platform=$(echo "$f" | sed "s|.*/ready-to-post/||" | cut -d'/' -f1)
title=$(grep -m1 '^[^#\-\*>|` ]' "$f" 2>/dev/null | head -c 100)
rel="${f##$VAULT/}"
echo "ITEM|$platform|$rel|$title"
fi
done
else
echo "DIR_MISSING:$READY_DIR"
fi步骤3 — 获取天气:
bash
curl -s --max-time 5 "wttr.in/CITY_HERE?format=3" || echo "WEATHER_UNAVAILABLE"PHASE 3: OUTPUT
阶段3:输出结果
Format and print the brief to the terminal:
☀️ Morning Brief — [Weekday, Month Day]
TODAY'S 3 ACTIONS
[numbered actions, or fallback message if file missing]
READY TO POST ([shown] of [total])
[platform] [title] — [relative file path]
...and X more in the pipeline ← only if total > 5
WEATHER
[wttr.in output or fallback]Formatting rules:
- Cap ready-to-post display at 5 items (newest-modified first)
- If doesn't exist:
content/ready-to-post/No ready-to-post folder found - If no unposted files:
Content queue is empty - If actions file missing:
No actions file for today — create one at bambf/tracking/daily-actions/YYYY-MM-DD.md - If weather fails: — do not abort the brief
Weather unavailable (offline)
将简报格式化后输出到终端:
☀️ Morning Brief — [Weekday, Month Day]
TODAY'S 3 ACTIONS
[numbered actions, or fallback message if file missing]
READY TO POST ([shown] of [total])
[platform] [title] — [relative file path]
...and X more in the pipeline ← only if total > 5
WEATHER
[wttr.in output or fallback]格式规则:
- 待发布内容最多显示5条(按修改时间从新到旧排序)
- 如果目录不存在:显示
content/ready-to-post/No ready-to-post folder found - 如果没有未发布文件:显示
Content queue is empty - 如果行动文件缺失:显示
No actions file for today — create one at bambf/tracking/daily-actions/YYYY-MM-DD.md - 如果天气获取失败:显示— 不要终止简报生成
Weather unavailable (offline)
PHASE 4: SELF-CRITIQUE
阶段4:自检校验
Before delivering, run this internal check. Fix anything that fails — do not deliver until all 4 pass.
- Actions accuracy — Was the actions file found? Did numbered items extract correctly? If the file exists but no items were found, note the potential heading mismatch.
- Content completeness — Count the lines in Step 2 output. Does the number shown in the brief match? Were any files skipped?
ITEM| - Weather result — Did curl return valid output? Is the fallback shown if it failed?
- Format cleanliness — No raw bash output. No placeholder text. All three sections present.
输出前运行内部检查,修复所有不符合项——所有4项检查通过后再输出结果。
- 行动事项准确性 — 是否找到行动文件?编号项是否正确提取?如果文件存在但没有提取到条目,需要标注可能的标题不匹配问题。
- 内容完整性 — 统计步骤2输出中行的数量,是否和简报中显示的数量一致?有没有文件被遗漏?
ITEM| - 天气结果有效性 — curl是否返回有效输出?如果获取失败是否显示了 fallback 内容?
- 格式整洁度 — 没有原始bash输出,没有占位符文本,三个模块完整展示。
Example Output
输出示例
☀️ Morning Brief — Friday, February 28
TODAY'S 3 ACTIONS
1. Finish Q1 content calendar
2. Send invoice to BAMBF client
3. Publish LinkedIn post on AI ops
READY TO POST (5 of 9)
[linkedin] Nobody talks about what happens when your AI system fails... — content/ready-to-post/linkedin/ai-ops-failure.md
[twitter] The overnight ops shift is real. We run Scribe at 2am... — content/ready-to-post/twitter/async-ops.md
[newsletter] AI marketing systems that actually work — content/ready-to-post/newsletter/systems-post.md
[linkedin] Three things I stopped doing after deploying agents — content/ready-to-post/linkedin/stopped-doing.md
[twitter] Founders who ignore async AI ops are about to find out why — content/ready-to-post/twitter/ignore-ops.md
...and 4 more in the pipeline
WEATHER
Ann Arbor: ☀️ +42°F☀️ Morning Brief — Friday, February 28
TODAY'S 3 ACTIONS
1. Finish Q1 content calendar
2. Send invoice to BAMBF client
3. Publish LinkedIn post on AI ops
READY TO POST (5 of 9)
[linkedin] Nobody talks about what happens when your AI system fails... — content/ready-to-post/linkedin/ai-ops-failure.md
[twitter] The overnight ops shift is real. We run Scribe at 2am... — content/ready-to-post/twitter/async-ops.md
[newsletter] AI marketing systems that actually work — content/ready-to-post/newsletter/systems-post.md
[linkedin] Three things I stopped doing after deploying agents — content/ready-to-post/linkedin/stopped-doing.md
[twitter] Founders who ignore async AI ops are about to find out why — content/ready-to-post/twitter/ignore-ops.md
...and 4 more in the pipeline
WEATHER
Ann Arbor: ☀️ +42°FDaily Actions File Format
每日行动文件格式
Expected path:
<vault>/bambf/tracking/daily-actions/YYYY-MM-DD.mdExpected structure:
markdown
undefined预期路径:
<vault>/bambf/tracking/daily-actions/YYYY-MM-DD.md预期结构:
markdown
undefinedDaily Actions — 2026-03-01
Daily Actions — 2026-03-01
Today's 3 Actions
Today's 3 Actions
- First priority
- Second priority
- Third priority
If you use a different path or heading, tell Claude Code when invoking the skill.
---- First priority
- Second priority
- Third priority
如果你使用不同的路径或标题,调用技能时告知Claude Code即可。
---Requirements
依赖要求
- Claude Code with bash tool access
- Vault with folder (files must contain
content/ready-to-post/to register as unposted)**Posted:** ❌ - installed (weather fails gracefully without it)
curl - Daily actions file optional — brief still runs without it
- 拥有bash工具访问权限的Claude Code
- 包含文件夹的vault(文件需要包含
content/ready-to-post/标记才会被识别为未发布)**Posted:** ❌ - 安装了(没有安装的话天气模块会优雅降级)
curl - 每日行动文件为可选配置——没有该文件简报仍可正常运行