技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
radar【数据与研究】When you want to monitor known sources on a schedule and feed the good stuff into your second brain. Configure sources once (YouTube, RSS/newsletters, subreddits, Hacker News, Bluesky, Mastodon, X, LinkedIn, keyword searches); each run fetches only what's new, scores it against your stated focus, writes one digest to the vault, and auto-captures high…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
deep-research answers a question you asked. radar surfaces the answers to questions you haven't asked yet, from sources you already trust, every day, without you going to look.
sources.yaml → fetch new only → score → digest → promote → raw/ → /sb compile
(config) (state files) (1–5) (vault) (you) (vault) (wiki)
Two hard rules keep this from becoming noise:
raw/ captures happen only for items that clear the auto-capture bar, or that you explicitly promote.| Path | What |
|---|---|
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/radar/sources.yaml | The source list (private, gitignored) |
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/radar/interests.local.md | Global relevance context — what you care about right now |
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/radar/state/<source-id>.json | Seen-item IDs + last run per source |
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/radar/runs/<date>.json | Machine-readable run record (backs promote) |
${MAKERSKILLS_CONFIG:-$HOME/.config/makerskills}/radar/logs/<date>.log | Unattended-run stdout, for debugging a silent morning |
<vault>/outputs/radar/<YYYY-MM-DD>.md | The human digest |
<vault>/raw/<type>-<slug>.md | Captured items, in second-brain's schema |
<vault> is ${SECOND_BRAIN_VAULT:-$HOME/Documents/SecondBrain}.
| Invocation | Mode |
|---|---|
/radar / /radar run / "check my sources" / "run my radar" | run |
/radar run <source-id> | run, single source |
/radar digest / "what's new from my sources" | digest |
/radar promote 3 7 12 / "promote item 4" / "capture the Isenberg one" | promote |
/radar add <type> <target> / "monitor this channel" / "watch r/SaaS" | add |
/radar sources / /radar list | sources |
/radar pause <id> / /radar resume <id> / /radar remove <id> | manage |
/radar doctor | doctor |
/radar schedule | schedule |
If sources.yaml doesn't exist in any mode but add/schedule, run first-time setup: copy references/templates/sources.example.yaml into place, create state/, runs/, logs/, then walk the user through adding their first 3–5 sources. Don't run against the example file's placeholder sources.
Read references/sources-schema.md before touching sources.yaml in any mode.
sources.yaml. Filter to enabled: true sources whose cadence is due (compare against each state file's last_run; daily = due if last run was on an earlier calendar day).interests.local.md — this is the global relevance context every item gets scored against, on top of each source's own focus.defaults.first_run_lookback_days (default 3) instead of "since last run" so a new source doesn't dump its entire archive.Read references/fetchers.md for the exact command per source type. Fetch every due source in parallel — they're independent, and a serial run over 15 sources is the difference between a 40-second morning job and a 6-minute one.
Rules that matter more than they look:
degraded with the error text, and carry on. A dead RSS feed must not cost you the YouTube results.max_items_per_source (default 15). If a source blew past the cap, say so in the digest — it usually means the lookback is too wide or the source got noisy.seen list, then by published against the lookback window. Both, not either: IDs catch re-publishes, dates catch feeds that recycle IDs.degraded and skipped; don't retry in a loop, don't let it block the digest.created_at, never by position. ScrapeCreators returns pinned and high-engagement tweets interleaved with recent ones — a single verified call put a 2024 tweet second. Trusting the order makes radar "discover" years-old posts as new.credits_remaining; record it in the run record and warn in the digest below ~1,000.AUTH_TOKEN/CT0 and any paid keys (env → OS keychain) before fetching, and skip the source types that need what's missing rather than discovering it per-item. references/fetchers.md → "Credentials" has the resolution order.For each new item, produce a relevance score 1–5 against the source's focus + interests.local.md:
| Score | Meaning |
|---|---|
| 5 | Directly actionable for a named project or open question. You'd want this in the wiki. |
| 4 | Strong topical match with genuinely new information. |
| 3 | On-topic, but restates what you already know. |
| 2 | Tangential — same field, different concern. |
| 1 | Noise. Promo, engagement bait, off-topic. |
Score from the title + description/excerpt + whatever the feed gave you. Do not fetch full content to score — that's backwards, and it's what makes daily jobs slow and expensive. Full fetch happens on capture only.
Then bucket:
>= auto_capture_at (default 5) → capture now, in full (Step 4)>= list_at (default 3) → listed in the digest as promotablelist_at → collapsed into a "skipped" count with titles in a <details> block. Never silently dropped — a bad filter must be visible.Write the score's reason in one clause. "Names the exact attribution problem TracerKit solves" is useful. "Relevant to your interests" is not, and if that's the best you can write, the score is a 3.
For each item at or above auto_capture_at, fetch the full thing and write it to <vault>/raw/ following second-brain's schema (read that skill's capture conventions; the vault's CLAUDE.md or AGENTS.md is authoritative):
| Source type | Full fetch | raw/ prefix |
|---|---|---|
| youtube | watch-video in transcript mode | resource- |
| rss / keyword | URL fetch of the article body (e.g. WebFetch) | article- |
| reddit / hn | Fetch the post + top comments | article- (link posts: fetch the target) |
| bluesky / mastodon | social-fetch (public APIs — post + replies in one call) | tweet- |
| x | social-fetch | tweet- |
social-fetch | bookmark- |
Every captured file gets a header:
source: <url>
captured: YYYY-MM-DD
via: radar/<source-id>
The via: line is what makes a bad source auditable later — when the wiki fills with mediocre pages, you can trace which source produced them.
Render references/templates/digest.md to <vault>/outputs/radar/<YYYY-MM-DD>.md.
If a digest already exists for today (second run same day), merge: append the new items with continued numbering, update the run header's counts, and add a second run line. Never overwrite — the numbers in an existing digest may already have been used in a promote call.
Per source, write state/<source-id>.json: last_run, last_status (ok | degraded | error), error if any, and seen — the item IDs, capped at the most recent 300 (a feed rarely revisits further back, and unbounded state files are how this rots).
Write runs/<YYYY-MM-DD>.json with the full item list, each with its digest number, score, URL, source ID, and capture status. promote reads this file, so it must contain everything needed to fetch an item without re-polling the source.
Per the standing vault rule: git -C "<vault>" pull --rebase --autostash, commit the digest + captures in one semantic commit (radar: 2026-08-28 digest — 34 items, 3 captured), push. Pull first, always — an unattended job that force-diverges the vault is worse than one that doesn't run.
In an interactive session, print the digest summary inline — run stats, the captured items, the top 5 promotable ones by score, and any degraded sources. Don't print the full skipped list.
In an unattended run (headless agent, e.g. claude -p or codex exec), print the same thing to stdout; the scheduler captures it to logs/<date>.log.
/radar promote 3 7 12 — pull specific digest items into raw/ in full.
runs/<date>.json (today's by default; /radar promote --date 2026-08-26 4 for an older digest).captured: true) and the digest note — move the promoted lines into the Captured section with their raw/ paths.Accept fuzzy references too: "promote the Isenberg one" → match against titles in the run record, confirm the match if there's more than one candidate.
Show today's digest. If none exists, say when the last run was and offer to run now. /radar digest yesterday or /radar digest 2026-08-26 for a specific day. /radar digest week summarizes the last 7 days: totals per source, capture rate, and which sources produced nothing.
/radar add youtube @GregIsenberg, /radar add reddit r/SaaS, /radar add x @levelsio, or just "monitor this channel" with a URL.
references/fetchers.md → "Resolving a target" for the per-type resolution (handle → channel ID, site URL → feed URL, etc.).sources.yaml. Show the user the 3 most recent items as proof it works.sources.yaml with a kebab-case id (yt-greg-isenberg, rd-saas). Don't create the state file — first run handles it, with the first-run lookback.Table of every source: id, type, target, enabled, cadence, last run, last status, items seen in the last 7 days, capture rate. Sort degraded/erroring sources to the top.
Flag two failure patterns explicitly, because they're the ones that quietly waste a daily job:
focus or removing it.max_items_per_source. Suggest a narrower target or a shorter lookback.Health-check without writing anything to the vault:
id, type, focus; IDs are unique.SECOND_BRAIN_VAULT set and the vault writable; vault is a git repo with a remote; MAKERSKILLS_CONFIG set.credits_remaining for ScrapeCreators. $SCRAPECREATORS_API_KEY is the one that matters — it carries X and LinkedIn. No key is required for youtube / rss / hn / bluesky / mastodon / reddit. Check it under the shell that exports it: a key in ~/.zshenv is invisible to a bash probe, which reports a false negative.Output a fix list, most-broken first. Run this before blaming the skill for a quiet morning.
Installs the daily job. Read references/scheduling.md — it has the launchd (macOS) and systemd (Linux) templates, the PATH/env gotchas that make unattended headless runs fail silently, and the verification steps.
Defer to loopify if the user wants something other than a fixed daily run (interval polling, conditional bail-outs, dynamic pacing).
sources mode exists to catch that; act on what it flags.Projects/, Daily/, Inbox/, Notes/, Templates/, Tasks.md, Kanban.md, or Home.md. radar owns exactly two paths in the vault: outputs/radar/ and new files in raw/.second-brain — radar fills raw/, /sb compile turns it into wiki pages. A good rhythm is radar daily, compile weekly. Captured files carry via: radar/<source-id> so compilation can trace provenance.watch-video — full-fetch path for YouTube captures (transcript mode; escalate to visual mode manually if a video earns it).social-fetch — full-fetch path for every social item, and the owner of the per-platform strategy ladders. Radar deliberately does not reimplement them; when a chain changes, it changes there. Radar also shares its cache at ~/Documents/social-fetches/_cache/.last30days — available as a keyword engine, and the source of radar's free X path (it vendors the bird-search client) and the keyless Reddit techniques. Worth re-reading when a platform's access breaks; it tracks these endpoints closely.deep-research — escalation path. When a digest item is interesting enough to need context radar can't give, hand the URL to deep-research.loopify — scheduling judgment beyond the default daily job.jab-hook — high-scoring items are content raw material; a Content Ideas wiki page is the handoff point.business-brainstorm — a keyword source watching a market you're considering feeds the idea filter with live signal.