Agent skill

Daily Brief

by leiting-eric in leiting-eric/DailyBrief

Operational knowledge for the daily-brief digest pipeline (this project).

MITAuto-check: notesProductivity & Automation

Install Daily Brief

skills CLI
$ npx skills add leiting-eric/DailyBrief --skill daily-brief -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install leiting-eric/DailyBrief daily-brief --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/leiting-eric/DailyBrief.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/daily-brief .claude/skills/daily-brief && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
daily-brief
GitHub stars
367
Token cost
~3k tokens
SKILL.md length
1,285 words
Files
1
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Operational knowledge for the daily-brief digest pipeline (this project).

  • Works in 2 steps: Claude Code session opened inside the… → Session opened elsewhere — read the…
  • Asks about running daily / regenerating sections / debugging a failed run / adding
  • SKILL.md covers Project root assumption, Quick command reference, File map — where to change what and How LLM enrichment works…, plus 6 more sections
  • Calls npm and node

What it does

Daily Brief is an agent skill from leiting-eric/DailyBrief. Operational knowledge for the daily-brief digest pipeline (this project). RSS/API fetchers, pluggable LLM enrichment (default claude CLI on Max; also anthropic/openai/deepseek/minimax API), trading section, HTML rendering, cross-platform scheduler integration (Windows Task Scheduler / macOS launchd / Linux cron). Load when the user asks about running daily / regenerating sections / debugging a failed run / adding or disabling sources / LLM quota / scheduler / why a tab shows wrong data / why a source failed /…

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Productivity & Automation, covering Scheduled and recurring tasks and Trading and backtesting. It works with npm, Linux, macOS and DeepSeek. The repository describes itself as: AI 每日新闻简报 · GitHub 热门 + X 热门文章 + 行情技术分析 · 23 个数据源聚合 + LLM 中文摘要 · 本地或 GitHub Actions 部署. The licence is MIT.

When your agent uses it

  • Asks about running daily / regenerating sections / debugging a failed run / adding
  • Disabling sources / LLM quota / scheduler / why a tab shows wrong data / why a source failed / switching LLM backend

Example prompts

  • “/daily-brief”

Workflow steps

2 steps, taken from the first numbered list in SKILL.md.

  1. Claude Code session opened inside the project — already there, no action needed
  2. Session opened elsewhere — read the config file and cd

What it can do on your machine

Read from SKILL.md and the folder at commit 75e24a6. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npm
    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Daily Brief loads about 3k tokens when it runs. Until then it costs about 178 tokens; SKILL.md has 1,285 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~178
When it runs · the whole SKILL.md, loaded when a task matches
~3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NoteMentions a .env fileSKILL.md:8
    RT_TZ` (e.g. `Asia/Shanghai`, `UTC`) in `.env.local` to override.
  • NoteMentions a .env fileSKILL.md:92
    de-cli`: wait or temporarily switch via `.env.local` (`LLM_BACKEND=openai` etc.)
  • NoteMentions a .env fileSKILL.md:95
    ackend is active = `LLM_BACKEND` env in `.env.local`; not set → `claude-cli`

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from leiting-eric/DailyBrief at commit 75e24a6, republished under its MIT licence (© leiting-eric). 1,285 words, ~3,032 tokens.

Download SKILL.mdSave it as .claude/skills/daily-brief/SKILL.md (or your agent's skills folder).
name
daily-brief
description
Operational knowledge for the daily-brief digest pipeline (this project). RSS/API fetchers, pluggable LLM enrichment (default claude CLI on Max; also anthropic/openai/deepseek/minimax API), trading section, HTML rendering, cross-platform scheduler integration (Windows Task Scheduler / macOS launchd / Linux cron). Load when the user asks about running daily / regenerating sections / debugging a failed run / adding or disabling sources / LLM quota / scheduler / why a tab shows wrong data / why a source failed / switching LLM backend. Always prefer the documented npm commands over re-implementing logic. Diagnose by reading logs/daily-*.log first, then logs/llm-calls.jsonl for LLM-side issues.

daily-brief — Operational Skill

This project generates a single-page HTML daily digest covering tech / finance / politics / market data / community discussion. The pipeline runs locally via the OS scheduler (Windows Task Scheduler / macOS launchd / Linux cron, default 08:00 local time) and emits daily_reports/<YYYY-MM-DD>/<YYYY-MM-DD>.html + sidecar files (each date gets its own subdir). The date label uses the system local timezone by default — set REPORT_TZ (e.g. Asia/Shanghai, UTC) in .env.local to override.

Detailed architecture lives in code; this skill is a cheat sheet for operating and diagnosing, not a re-explanation of the system.

Project root assumption

All paths in this skill are relative to the project root (the directory that contains package.json, lib/, scripts/).

Before any command, ensure the working directory is the project root. Two cases:

  1. Claude Code session opened inside the project — already there, no action needed

  2. Session opened elsewhere — read the config file and cd:

    bash
    # Cross-platform Node one-liner (prints the project root path):
    node -e "const fs=require('fs'),os=require('os'),path=require('path');const cfg=path.join(os.homedir(),'.daily-brief-config');if(fs.existsSync(cfg))console.log(fs.readFileSync(cfg,'utf8').trim());else process.exit(1)"

    Use the printed path: cd "$(...)" on bash / Set-Location (...) in PowerShell.

The config file is written by node scripts/install.mjs --global. If it's missing the user hasn't done a global install — tell them to run it.

Quick command reference

NeedCommandCost
Full pipelinenpm run daily~5-8 min, ~6 Sonnet calls
Fetch sanity only (no LLM)npm run dry-run~30s
Re-render existing sidecarnpm run render [date]<1s
Re-run trading sectionnpm run regen-trading [date]~2 min, 1 LLM call
Top-up missing summarynpm run regen-enrich <cat:sub> [date]~20-40s, 1 LLM call
Open today's report in Chromenpm run openinstant
Sonnet quota + call historynpm run quota-reportinstant

[date] defaults to today's date in the report timezone (system local, or REPORT_TZ if set). The pipeline and the OS scheduler both run in local time, so the report's date label = the date when the trigger fired in the report timezone. A user with REPORT_TZ=Asia/Shanghai whose machine fires the trigger at 23:00 UTC-8 will get a "next-day Shanghai" file, e.g. daily_reports/2026-05-17/2026-05-17.html.

<cat:sub> accepted by regen-enrich: finance:news, politics:world, tech:ai-news. Single-source X 推文 (tech:x-viral) is enriched as part of daily only — no top-up path.

File map — where to change what

TaskFile
Add / disable / re-categorize a sourcesources.config.json (project root — single source of truth; lib/sources/registry.ts is just a loader)
Rename L1 tab labelslib/output/render.ts CATEGORY_LABELS
Reorder / rename L2 subcategoriesSUBCATEGORY_ORDER + SUBCATEGORY_LABELS in same file
Change per-source item capSOURCE_DISPLAY_LIMITS
Change merged-timeline capMERGED_SUBGROUP_LIMITS
Add a Sonnet enrichment promptlib/ai/enrich.ts — copy XVIRAL_SYSTEM_PROMPT pattern
Wire an enrichment into pipelinescripts/daily.ts — await enrichXxx(articles) in main()
Add a new fetcher typeNew file in lib/sources/ + branch in lib/sources/dispatch.ts
Adjust HTML stylinginline <style> block in renderHtml() in lib/output/render.ts
Change scheduler trigger timenode scripts/install.mjs --at HH:MM (re-registers)
Wrapper script the scheduler invokesscripts/run-daily.mjs

How LLM enrichment works (mental model)

  • Each merged L2 subcategory gets a Sonnet pass: GH-trending (per-source), finance:news, politics:world, tech:ai-news, tech:x-viral.
  • Each pass = one batched Sonnet call for all items in that subgroup. Don't iterate per-item.
  • Sources with lang: "zh" in registry skip enrichment (already Chinese).
  • Failures are non-fatal: skipped articles just render without summary.

Diagnostic flow

Order matters — top-to-bottom:

"今天日报没出来" / "Chrome 没弹"
  1. Check scheduled task state — platform-specific:
    • Windows: Get-ScheduledTaskInfo -TaskName DailyBrief → LastRunTime + LastTaskResult (0=success, 267009=running, else failed)
    • macOS: launchctl list | grep com.daily-brief (PID column + last exit code)
    • Linux: cron doesn't track per-job state; look at logs/cron.log
  2. Tail today's log (date = local, not UTC):
    bash
    node -e "const fs=require('fs'),d=new Date(),pad=n=>String(n).padStart(2,'0');console.log(fs.readFileSync('logs/daily-'+d.getFullYear()+'-'+pad(d.getMonth()+1)+'-'+pad(d.getDate())+'.log','utf8').split('\n').slice(-40).join('\n'))"
  3. Check report files exist: ls daily_reports/<date>/ (any platform) or Get-ChildItem daily_reports\<date>\ (Windows)
"某个源数据不对 / 0 条"
  1. Look at fetch lines near top of log — <id> <count> or <id> FAILED — <reason>
  2. If specific source failed: read its fetcher in lib/sources/<source>.ts
  3. If Cloudflare-related: see "LinuxDo lesson" below
  4. Single-source failure must never kill the run (try/catch per source in daily.ts)
"LLM 调用炸 / 中文摘要缺失"
  1. npm run quota-report — per-backend summary; for claude-cli shows 5h window, for API backends shows 24h spending
  2. If quota hot on claude-cli: wait or temporarily switch via .env.local (LLM_BACKEND=openai etc.)
  3. If specific phase missing summaries: npm run regen-enrich <cat:sub>
  4. Each call logged to logs/llm-calls.jsonl (legacy claude-calls.jsonl still read for backwards-compat) — grep "success":false, see errorCategory (quota / timeout / auth / other)
  5. Which backend is active = LLM_BACKEND env in .env.local; not set → claude-cli
"UI 出错 / 某个 tab 显示异常"
  1. npm run render (1 second) — often fixes display-only bugs
  2. If still wrong: read rendered HTML for the affected panel
  3. renderRawCategoryPanel / renderSubContent chain in render.ts is where panel structure lives

Recurring failure patterns (institutional knowledge)

LinuxDo / Cloudflare WAF
  • LinuxDo is behind Cloudflare and frequently flags datacenter-IP exits with "Just a moment..." challenges
  • Do NOT add aggressive retry to its fetcher — burst requests escalate the WAF flag, causing persistent blocks
  • May ship with enabled: false depending on current IP rep
  • Browser works because of cookies + JS challenge; curl can't do either
  • If re-enabling: keep single attempt, accept intermittent failures
Show full SKILL.md (497 more words)Show less
Run-daily.mjs wrapper notes
  • Tees npm run daily stdout+stderr to logs/daily-<local-date>.log via stream pipes (real-time, not buffered)
  • Exit code from npm run daily is propagated to the OS scheduler
  • On exit 0: spawns npm run open detached so Chrome opens without blocking
  • Cross-platform: same .mjs file works on Windows / macOS / Linux
"X 推文 出现非英文"
  • API's lang=en param is best-effort; some slip through
  • Fix in lib/sources/attentionvc.ts isEnglish() — checks langsDetected (most reliable) + lang === "zxx" (image/code-only, kept)
"社区讨论 tab 偶发空白"
  • Was a JS scope bug: sub-tab/source-tab handlers used data-cat="tech" selector. Tech main panel AND community panel both had sub-content with data-cat="tech", so clicking AI 媒体 in tech panel deactivated cn-community in community panel
  • Fixed: handlers use btn.closest('.panel') + btn.closest('.sub-content'). If regression, look at inline <script> block at end of renderHtml()
Trading commentary "watchlist empty"
  • Sonnet occasionally returns valid JSON with empty watchlist. 1-shot retry built into lib/ai/trading-commentary.ts with stronger prompt
  • If retry also fails, render falls back to empty trading panel — run isn't aborted

Source registry conventions

Sources live in sources.config.json at the project root. lib/sources/registry.ts only loads + validates that JSON at module-init; never hardcode sources in TS.

  • Every source has: id, name, type (rss/api/scrape), url, category, subcategory?, enabled?, useCurl?, lang?, locales?
  • useCurl: true for sources behind Cloudflare-style TLS-fingerprint blocks
  • lang: "zh" (or "en") for sources already in a specific language — enrich skips them when REPORT_LOCALE matches
  • locales: ["zh"|"en"] filters which REPORT_LOCALE keeps the source. Omit → both
  • Disabled sources stay in the JSON with enabled: false + a notes field explaining why — don't delete
  • Run npm run sources to see the table by category with current enable/filter status

Render layout (current, may evolve)

L1 tabs in order: tech / trading / politics / finance / community

技术动态 (tech)
  L2: GitHub Trending  (per-source, cap 20)
  L2: X 推文           (single source attentionvc-ai, cap 20, preserve fetch order)
  L2: AI 媒体          (merged 7 RSS sources, cap 15, summary)

市场行情 (trading)
  asset-group tabs: macro / 美股 / 加密 / 中港 / 商品外汇

时政观察 (politics:world)
  merged single timeline, cap 15, summary, sports filtered

财经要点 (finance:news)
  merged single timeline, cap 12, summary

社区讨论 (community)
  Source tabs: V2EX / LinuxDo (cap 10 each)
  Note: cn-community is registered under category=tech but rendered as its
  own L1 panel — see TECH_MAIN_SUBS vs TECH_COMMUNITY_SUBS in render.ts

Scheduler integration (cross-platform)

scripts/install.mjs registers the daily trigger via the OS-native scheduler:

OSMechanismWake-from-sleep
WindowsTask Scheduler "DailyBrief" (WakeToRun, AllowStartIfOnBatteries, StartWhenAvailable) + power-plan wake timers✓ wakes laptop
macOSlaunchd plist ~/Library/LaunchAgents/com.daily-brief.plist✗ doesn't wake; configure pmset separately if needed
Linuxcrontab entry tagged # daily-brief✗ cron doesn't fire while suspended — run skipped

Common:

  • Default trigger: 08:00 local time (--at HH:MM to change)
  • Runs as current interactive user — required because claude CLI's OAuth token lives in user profile
  • Execution timeout: 30 min (Windows only; macOS/Linux no built-in timeout)
  • Set up: node scripts/install.mjs [--at HH:MM] [--global]
  • Tear down: node scripts/uninstall.mjs
  • Inspect: Get-ScheduledTask DailyBrief | fl or taskschd.msc GUI

What NOT to do

  • Don't console.log debugging that won't survive — use structured logger or write to logs/
  • Don't add process.exit(1) deep in a fetcher; let daily.ts's per-source try/catch handle it
  • Don't bypass runLlm (lib/ai/llm.ts) by importing a specific backend directly — that defeats the LLM_BACKEND switch and pins call sites to one provider
  • Don't change the default backend silently; if user has Max subscription they almost certainly want claude-cli to keep using it. Switching to API costs them money
  • Don't put AI-generated digest fields (hero_headline, editor_note, keywords) back into the HTML view — they're intentionally hidden. Still generated and live in <date>.json and <date>.md for archive
  • Don't add Playwright / Puppeteer dependencies casually — project uses curl + JSON APIs to stay light

© leiting-eric, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/daily-brief of leiting-eric/DailyBrief.

Open the folder on GitHubat commit 75e24a6

Compare with similar skills

Daily Brief next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Daily Brief compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Daily Brief this skillleiting-eric/DailyBrief367—~3kAutomated safety check: NotesMIT
Env Doctorcat-xierluo/legal-skills720—~756Automated safety check: PassMIT
Shadowvpn Deploy Clientmadeye/shadowvpn101—~2.4kAutomated safety check: NotesMIT
Managekenneth-liao/ai-launchpad-marketplace126—~4.1kAutomated safety check: PassNone
Openai Screenshottrailofbits/skills-curated513—~2kAutomated safety check: NotesCC-BY-SA-4.0
Claude Code Ping Start 5h Quotadaymade/claude-code-skills1.4k—~1.2kAutomated safety check: PassMIT

Similar skills

  • Env Doctor

    cat-xierluo/legal-skills

    本机开发环境与全局包的体检、账本与安装纪律,覆盖所有包管理器(npm/npx、nvm、pip/pipx、uv、brew、bun)与运行时环境面(~/.local/bin 垫片、PATH、python 解释器版图、LaunchAgents、cron、shell rc 漂移对照)。当用户问「node/python 为什么是这个版本」「npm/pip…

    720 GitHub stars~756 tokensUpdated today
    Productivity & AutomationAuto-check passed
  • Shadowvpn Deploy Client

    madeye/shadowvpn

    Deploy, install, and run the ShadowVPN client in a target environment — Linux (systemd), macOS (launchd), or Windows (Wintun, foreground launcher or scheduled-task service).

    101 GitHub stars~2.4k tokensUpdated 1 mo ago
    Productivity & AutomationAuto-check: notes
  • Manage

    kenneth-liao/ai-launchpad-marketplace

    Manage scheduled Claude Code tasks — add (recurring or one-off), list, pause, resume, remove, view results, and test execution of skills, prompts, and scripts with safety controls and notifications.

    126 GitHub stars~4.1k tokensUpdated 6 mo ago
    Productivity & AutomationAuto-check passed
  • Openai Screenshot

    trailofbits/skills-curated

    Official

    A skill your agent uses when the user explicitly asks for a desktop or system screenshot (full screen, specific app or window, or a pixel region), or when tool-specific capture capabilities are…

    513 GitHub stars~2k tokensUpdated 2 mo ago
    Productivity & AutomationAuto-check: notes
  • Claude Code Ping Start 5h Quota

    daymade/claude-code-skills

    睡前/离开前额度耗尽时,设置一次性本机定时器,在 Claude 订阅额度重置后自动发一条极简 claude -p 消息,立刻开启新的 5 小时用量窗口——用户睡醒时新窗口已跑掉大半,等于白赚一个 冷却期。Use when 用户说「还有 X 小时重置额度,帮我定时戳一下 Claude」「我去睡觉了, 到点 ping 一下开启新窗口」「额度用完了,重置后帮我踩个点」「设个定时器开启新的 5 小时…

    1.4k GitHub stars~1.2k tokensUpdated today
    Productivity & AutomationAuto-check passed
  • Nextclaw Autostart

    Peiiii/nextclaw

    A skill your agent uses when the user asks about NextClaw autostart, auto-start on login or reboot, daemon/service registration, LaunchAgent, systemd, Windows Scheduled Task, service autostart…

    260 GitHub stars~943 tokensUpdated today
    Productivity & AutomationAuto-check: notes

Questions about Daily Brief

What does Daily Brief do?

Operational knowledge for the daily-brief digest pipeline (this project). Daily Brief is an agent skill from leiting-eric/DailyBrief. Operational knowledge for the daily-brief digest pipeline (this project).

When should I use Daily Brief?

Daily Brief fits situations like: asks about running daily / regenerating sections / debugging a failed run / adding; disabling sources / LLM quota / scheduler / why a tab shows wrong data / why a source failed / switching LLM backend.

How do I install Daily Brief in Claude Code?

Run `npx skills add leiting-eric/DailyBrief --skill daily-brief -a claude-code`. Or copy the skill folder (.claude/skills/daily-brief in leiting-eric/DailyBrief) into .claude/skills/daily-brief in your project. Claude Code loads it when a task matches its description.

How do I install Daily Brief in Codex?

Run `npx skills add leiting-eric/DailyBrief --skill daily-brief -a codex`. Or copy the skill folder (.claude/skills/daily-brief in leiting-eric/DailyBrief) into .agents/skills/daily-brief in your project. Codex loads it when a task matches its description.

Can I use Daily Brief in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add leiting-eric/DailyBrief --skill daily-brief -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/daily-brief, .gemini/skills/daily-brief, .github/skills/daily-brief and .opencode/skills/daily-brief in your project.

What does Daily Brief need to run?

Going by SKILL.md and its folder, Daily Brief needs the command-line tools its instructions call (npm and node).

Does Daily Brief access the network?

SKILL.md contains no URLs. Its commands use npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Daily Brief safe to install?

Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Daily Brief use?

Daily Brief is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Daily Brief use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Daily Brief?

Skills that share tags, products or a category with Daily Brief: Env Doctor (cat-xierluo/legal-skills, 720 stars), Shadowvpn Deploy Client (madeye/shadowvpn, 101 stars), Manage (kenneth-liao/ai-launchpad-marketplace, 126 stars) and Openai Screenshot (trailofbits/skills-curated, 513 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Daily Brief?

leiting-eric (a GitHub user) maintains it in leiting-eric/DailyBrief, which has 367 GitHub stars. The repository was last updated on October 10, 2026.

Source: leiting-eric/DailyBrief on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.