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…
Operational knowledge for the daily-brief digest pipeline (this project).
$ npx skills add leiting-eric/DailyBrief --skill daily-brief -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install leiting-eric/DailyBrief daily-brief --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "daily-brief" agent skill from https://github.com/leiting-eric/DailyBrief/tree/main/.claude/skills/daily-brief into .claude/skills/daily-brief/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-brief", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/leiting-eric/DailyBrief/tree/main/.claude/skills/daily-briefType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add leiting-eric/DailyBrief --skill daily-brief -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install leiting-eric/DailyBrief daily-brief --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/leiting-eric/DailyBrief.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/daily-brief .agents/skills/daily-brief && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "daily-brief" agent skill from https://github.com/leiting-eric/DailyBrief/tree/main/.claude/skills/daily-brief into .agents/skills/daily-brief/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-brief", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add leiting-eric/DailyBrief --skill daily-brief -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install leiting-eric/DailyBrief daily-brief --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/leiting-eric/DailyBrief.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/daily-brief .cursor/skills/daily-brief && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "daily-brief" agent skill from https://github.com/leiting-eric/DailyBrief/tree/main/.claude/skills/daily-brief into .cursor/skills/daily-brief/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-brief", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/leiting-eric/DailyBrief.git --path .claude/skills/daily-brief--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add leiting-eric/DailyBrief --skill daily-brief -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install leiting-eric/DailyBrief daily-brief --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/leiting-eric/DailyBrief.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/daily-brief .gemini/skills/daily-brief && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "daily-brief" agent skill from https://github.com/leiting-eric/DailyBrief/tree/main/.claude/skills/daily-brief into .gemini/skills/daily-brief/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-brief", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install leiting-eric/DailyBrief daily-briefInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add leiting-eric/DailyBrief --skill daily-brief -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/leiting-eric/DailyBrief.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/daily-brief .github/skills/daily-brief && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "daily-brief" agent skill from https://github.com/leiting-eric/DailyBrief/tree/main/.claude/skills/daily-brief into .github/skills/daily-brief/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-brief", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add leiting-eric/DailyBrief --skill daily-brief -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install leiting-eric/DailyBrief daily-brief --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/leiting-eric/DailyBrief.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/daily-brief .opencode/skills/daily-brief && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "daily-brief" agent skill from https://github.com/leiting-eric/DailyBrief/tree/main/.claude/skills/daily-brief into .opencode/skills/daily-brief/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "daily-brief", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
daily-briefOperational 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). 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.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 75e24a6. It shows what the files ask for, not the result of running them.
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.
Shell commands in SKILL.md call:
npmnodeFrom the folder's file list and the shell code blocks in SKILL.md.
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.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
RT_TZ` (e.g. `Asia/Shanghai`, `UTC`) in `.env.local` to override.de-cli`: wait or temporarily switch via `.env.local` (`LLM_BACKEND=openai` etc.)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.
The full file from leiting-eric/DailyBrief at commit 75e24a6, republished under its MIT licence (© leiting-eric). 1,285 words, ~3,032 tokens.
.claude/skills/daily-brief/SKILL.md (or your agent's skills folder).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.
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:
Claude Code session opened inside the project — already there, no action needed
Session opened elsewhere — read the config file and cd:
# 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.
| Need | Command | Cost |
|---|---|---|
| Full pipeline | npm run daily | ~5-8 min, ~6 Sonnet calls |
| Fetch sanity only (no LLM) | npm run dry-run | ~30s |
| Re-render existing sidecar | npm run render [date] | <1s |
| Re-run trading section | npm run regen-trading [date] | ~2 min, 1 LLM call |
| Top-up missing summary | npm run regen-enrich <cat:sub> [date] | ~20-40s, 1 LLM call |
| Open today's report in Chrome | npm run open | instant |
| Sonnet quota + call history | npm run quota-report | instant |
[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.
| Task | File |
|---|---|
| Add / disable / re-categorize a source | sources.config.json (project root — single source of truth; lib/sources/registry.ts is just a loader) |
| Rename L1 tab labels | lib/output/render.ts CATEGORY_LABELS |
| Reorder / rename L2 subcategories | SUBCATEGORY_ORDER + SUBCATEGORY_LABELS in same file |
| Change per-source item cap | SOURCE_DISPLAY_LIMITS |
| Change merged-timeline cap | MERGED_SUBGROUP_LIMITS |
| Add a Sonnet enrichment prompt | lib/ai/enrich.ts — copy XVIRAL_SYSTEM_PROMPT pattern |
| Wire an enrichment into pipeline | scripts/daily.ts — await enrichXxx(articles) in main() |
| Add a new fetcher type | New file in lib/sources/ + branch in lib/sources/dispatch.ts |
| Adjust HTML styling | inline <style> block in renderHtml() in lib/output/render.ts |
| Change scheduler trigger time | node scripts/install.mjs --at HH:MM (re-registers) |
| Wrapper script the scheduler invokes | scripts/run-daily.mjs |
lang: "zh" in registry skip enrichment (already Chinese).summary.Order matters — top-to-bottom:
Get-ScheduledTaskInfo -TaskName DailyBrief → LastRunTime + LastTaskResult (0=success, 267009=running, else failed)launchctl list | grep com.daily-brief (PID column + last exit code)logs/cron.lognode -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'))"ls daily_reports/<date>/ (any platform) or Get-ChildItem daily_reports\<date>\ (Windows)<id> <count> or <id> FAILED — <reason>lib/sources/<source>.tsdaily.ts)npm run quota-report — per-backend summary; for claude-cli shows 5h window, for API backends shows 24h spendingclaude-cli: wait or temporarily switch via .env.local (LLM_BACKEND=openai etc.)npm run regen-enrich <cat:sub>logs/llm-calls.jsonl (legacy claude-calls.jsonl still read for backwards-compat) — grep "success":false, see errorCategory (quota / timeout / auth / other)LLM_BACKEND env in .env.local; not set → claude-clinpm run render (1 second) — often fixes display-only bugsrenderRawCategoryPanel / renderSubContent chain in render.ts is where panel structure livesenabled: false depending on current IP repnpm run daily stdout+stderr to logs/daily-<local-date>.log via stream pipes (real-time, not buffered)npm run daily is propagated to the OS schedulernpm run open detached so Chrome opens without blocking.mjs file works on Windows / macOS / Linuxlang=en param is best-effort; some slip throughlib/sources/attentionvc.ts isEnglish() — checks langsDetected (most reliable) + lang === "zxx" (image/code-only, kept)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 panelbtn.closest('.panel') + btn.closest('.sub-content'). If regression, look at inline <script> block at end of renderHtml()lib/ai/trading-commentary.ts with stronger promptSources 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.
id, name, type (rss/api/scrape), url, category, subcategory?, enabled?, useCurl?, lang?, locales?useCurl: true for sources behind Cloudflare-style TLS-fingerprint blockslang: "zh" (or "en") for sources already in a specific language — enrich skips them when REPORT_LOCALE matcheslocales: ["zh"|"en"] filters which REPORT_LOCALE keeps the source. Omit → bothenabled: false + a notes field explaining why — don't deletenpm run sources to see the table by category with current enable/filter statusL1 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.tsscripts/install.mjs registers the daily trigger via the OS-native scheduler:
| OS | Mechanism | Wake-from-sleep |
|---|---|---|
| Windows | Task Scheduler "DailyBrief" (WakeToRun, AllowStartIfOnBatteries, StartWhenAvailable) + power-plan wake timers | ✓ wakes laptop |
| macOS | launchd plist ~/Library/LaunchAgents/com.daily-brief.plist | ✗ doesn't wake; configure pmset separately if needed |
| Linux | crontab entry tagged # daily-brief | ✗ cron doesn't fire while suspended — run skipped |
Common:
--at HH:MM to change)node scripts/install.mjs [--at HH:MM] [--global]node scripts/uninstall.mjsGet-ScheduledTask DailyBrief | fl or taskschd.msc GUIconsole.log debugging that won't survive — use structured logger or write to logs/process.exit(1) deep in a fetcher; let daily.ts's per-source try/catch handle itrunLlm (lib/ai/llm.ts) by importing a specific backend directly — that defeats the LLM_BACKEND switch and pins call sites to one providerclaude-cli to keep using it. Switching to API costs them money<date>.json and <date>.md for archive© 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
Just SKILL.md in .claude/skills/daily-brief of leiting-eric/DailyBrief.
Open the folder on GitHubat commit 75e24a6
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Daily Brief this skillleiting-eric/DailyBrief | 367 | — | ~3k | Automated safety check: Notes | MIT | |
| Env Doctorcat-xierluo/legal-skills | 720 | — | ~756 | Automated safety check: Pass | MIT | |
| Shadowvpn Deploy Clientmadeye/shadowvpn | 101 | — | ~2.4k | Automated safety check: Notes | MIT | |
| Managekenneth-liao/ai-launchpad-marketplace | 126 | — | ~4.1k | Automated safety check: Pass | None | |
| Openai Screenshottrailofbits/skills-curated | 513 | — | ~2k | Automated safety check: Notes | CC-BY-SA-4.0 | |
| Claude Code Ping Start 5h Quotadaymade/claude-code-skills | 1.4k | — | ~1.2k | Automated safety check: Pass | MIT |
cat-xierluo/legal-skills
本机开发环境与全局包的体检、账本与安装纪律,覆盖所有包管理器(npm/npx、nvm、pip/pipx、uv、brew、bun)与运行时环境面(~/.local/bin 垫片、PATH、python 解释器版图、LaunchAgents、cron、shell rc 漂移对照)。当用户问「node/python 为什么是这个版本」「npm/pip…
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).
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.
trailofbits/skills-curated
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…
daymade/claude-code-skills
睡前/离开前额度耗尽时,设置一次性本机定时器,在 Claude 订阅额度重置后自动发一条极简 claude -p 消息,立刻开启新的 5 小时用量窗口——用户睡醒时新窗口已跑掉大半,等于白赚一个 冷却期。Use when 用户说「还有 X 小时重置额度,帮我定时戳一下 Claude」「我去睡觉了, 到点 ping 一下开启新窗口」「额度用完了,重置后帮我踩个点」「设个定时器开启新的 5 小时…
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…
Categories
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).
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.
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.
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.
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.
Going by SKILL.md and its folder, Daily Brief needs the command-line tools its instructions call (npm and node).
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.
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.
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.
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.
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.
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.