ai-digest
Run the daily AI tech news digest pipeline — collect, deduplicate, summarize, deliver
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Run the daily AI tech news digest pipeline — collect, deduplicate, summarize, deliver
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Create a new release — bump version, tag, generate changelog, create GitHub Release
Add a new news source (RSS or GitHub release) to ai-digest config
Validate sources.yml structure and check that all URLs/endpoints are reachable. Use when the user wants to check, verify, validate, or test the sources config, or after adding/modifying sources. Also use when the user mentions broken links, 404 errors, or source health checks.
| name | ai-digest |
| description | Run the daily AI tech news digest pipeline — collect, deduplicate, summarize, deliver |
You are running the ai-digest pipeline. Follow these steps exactly.
After completing each step, log a progress line to logs/YYYY-MM-DD.md via Bash:
echo "[$(date '+%Y-%m-%d %H:%M')] [pipeline ] <message>" >> logs/YYYY-MM-DD.md
This keeps the user informed in real-time (they watch the log via tail -f). Log at every step transition — do not batch multiple steps without logging.
Before anything else, invoke the /validate-sources skill. It checks config/sources.yml for structural errors and broken URLs.
Log the validation summary to logs/YYYY-MM-DD.md using the format:
[YYYY-MM-DD HH:MM] [validation ] Sources validation: X passed, Y failed, Z unable to verify
[YYYY-MM-DD HH:MM] [validation ] ✗ rss: source-name — HTTP 404
Log each failed/unverified source as a separate line.
Read these files:
config/sources.yml — list of all sourcesconfig/delivery.yml — language, output path, notification settingsCLAUDE.md — personal context (stack, projects, interests, topics to ignore)Log: Step 1: Config loaded (X RSS sources, Y GitHub repos)
Call the fetch_previous_urls MCP tool (no parameters).
It reads the last 3 days of digest markdown files from the output path and returns all previously published URLs and titles.
Save the returned entries — you will use them for semantic deduplication in Step 4.
Log: Step 2: Previous digests loaded — X entries from Y days or Step 2: No previous digests found, skipping dedup
Launch sub-agents in parallel to collect data from all sources:
Agent 1 — RSS feeds: Call the fetch_all_rss MCP tool (no parameters). It fetches all RSS feeds in parallel internally. Collect results.
Agent 2 — GitHub Releases: Call the fetch_github_releases MCP tool (no parameters). Collect results.
Merge all DigestItem[] arrays from all agents into one list.
Log: Step 3: Collected X RSS items (Y sources) + Z GitHub releases
Call the check_duplicates MCP tool with all collected items from Step 3.
Pass items as: { "items": [{ "title": "...", "url": "...", "source": "..." }, ...] }
The tool returns each item classified as exact_duplicate, likely_duplicate, or unique.
exact_duplicate — no exceptions.unique — keep as-is.For each likely_duplicate item, compare with the matched_with entry:
Review remaining unique items against the entries returned in Step 2.
If you notice a topic that was already covered in a previous digest and the new item adds nothing substantial — remove it.
Among the remaining items:
Log: Step 4: Deduplicated — removed X exact, Y likely, Z semantic, merged W within-day. V items remaining
Log: Step 5: Filtered — removed X items (topics: Y), Z items remaining
Read the language setting from delivery.yml. Generate ALL text in that language.
Assign each item to one category:
An item placed in Hot should NOT be duplicated in other categories.
For each item, write a catchy 1-2 sentence summary as the headline. Make it engaging, not dry. The headline should make the reader want to click through.
Log: Step 6: Categorized — Hot: X, Relevant: Y, AI: Z, Frontend: W, DevTools: V
Create the digest file with this structure:
---
date: YYYY-MM-DD
type: digest
language: <language from config>
sources: <number of sources that returned data>
items: <total items after dedup>
---
# <Digest title in configured language> — <date in configured language format>
> <total items> items from <sources count> sources
<intro paragraph>
## 🔥 Hot
- **<catchy headline>** — <summary>. [<source>](url)
## 🎯 <"Relevant to Your Projects" in configured language>
- **<catchy headline>** — <summary>. [<source>](url)
_<relevance note>_
## 🤖 AI / LLM
- **<catchy headline>** — <summary>. [<source>](url)
## ⚛️ Frontend
- ...
## 🔧 DevTools / Releases
- ...
Before the categorized sections, write a narrative intro (2–4 short paragraphs) that:
The Hot category is mandatory and must always be present. Skip any other category that has zero items.
Write the generated markdown to: <output_path>/YYYY-MM-DD.md
Use today's date for the filename.
Log: Step 8: Written to <output_path>/YYYY-MM-DD.md
If notification is true in delivery.yml, send a macOS notification:
osascript -e 'display notification "<N> items from <M> sources" with title "AI Digest Ready"'
If the pipeline produced zero items (all sources failed), send:
osascript -e 'display notification "All sources failed. Check logs." with title "AI Digest Failed"'
Print a summary of this run: