daily-briefing-builder

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Daily 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:
  • vault_path
    — absolute path to their Obsidian vault
  • city
    — city name for weather (wttr.in format, spaces as
    +
    )
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.

检查用户是否提供了以下参数:
  • vault_path
    — Obsidian vault的绝对路径
  • city
    — 获取天气的城市名称(wttr.in格式,空格用
    +
    代替)
如果任一参数缺失,请先询问用户再继续:
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"
fi
Step 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"
fi
Step 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
    content/ready-to-post/
    doesn't exist:
    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:
    Weather unavailable (offline)
    — do not abort the brief

将简报格式化后输出到终端:
☀️ 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.
  1. 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.
  2. Content completeness — Count the
    ITEM|
    lines in Step 2 output. Does the number shown in the brief match? Were any files skipped?
  3. Weather result — Did curl return valid output? Is the fallback shown if it failed?
  4. Format cleanliness — No raw bash output. No placeholder text. All three sections present.

输出前运行内部检查,修复所有不符合项——所有4项检查通过后再输出结果。
  1. 行动事项准确性 — 是否找到行动文件?编号项是否正确提取?如果文件存在但没有提取到条目,需要标注可能的标题不匹配问题。
  2. 内容完整性 — 统计步骤2输出中
    ITEM|
    行的数量,是否和简报中显示的数量一致?有没有文件被遗漏?
  3. 天气结果有效性 — curl是否返回有效输出?如果获取失败是否显示了 fallback 内容?
  4. 格式整洁度 — 没有原始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°F

Daily Actions File Format

每日行动文件格式

Expected path:
<vault>/bambf/tracking/daily-actions/YYYY-MM-DD.md
Expected structure:
markdown
undefined
预期路径:
<vault>/bambf/tracking/daily-actions/YYYY-MM-DD.md
预期结构:
markdown
undefined

Daily Actions — 2026-03-01

Daily Actions — 2026-03-01

Today's 3 Actions

Today's 3 Actions

  1. First priority
  2. Second priority
  3. Third priority

If you use a different path or heading, tell Claude Code when invoking the skill.

---
  1. First priority
  2. Second priority
  3. Third priority

如果你使用不同的路径或标题,调用技能时告知Claude Code即可。

---

Requirements

依赖要求

  • Claude Code with bash tool access
  • Vault with
    content/ready-to-post/
    folder (files must contain
    **Posted:** ❌
    to register as unposted)
  • curl
    installed (weather fails gracefully without it)
  • Daily actions file optional — brief still runs without it
  • 拥有bash工具访问权限的Claude Code
  • 包含
    content/ready-to-post/
    文件夹的vault(文件需要包含
    **Posted:** ❌
    标记才会被识别为未发布)
  • 安装了
    curl
    (没有安装的话天气模块会优雅降级)
  • 每日行动文件为可选配置——没有该文件简报仍可正常运行