# AI News Digest

> Aggregates latest AI news from RSS feeds and presents an interactive Top 10 digest. Use when user says "latest AI news", "AI news digest", "what's new in AI", "fetch AI news", or wants to see recent AI developments.

- Skill: `jaykim88/ai-news-digest` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jaykim88/ai-news-digest`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jaykim88/ai-news-digest/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: JayKim88 (https://skillmd.com/u/jaykim88)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/jaykim88/ai-news-digest

---


# AI News Digest

Fetches latest AI news from multiple sources and presents an interactive digest. User chooses time range and categories, browses results in the terminal, then selects which items to save.

---

## Execution Algorithm

### Step 1: Acknowledge Trigger

Briefly confirm that you're starting the AI News Digest.

**Example:** "AI 뉴스를 가져오겠습니다. 먼저 몇 가지 설정을 선택해주세요."

---

### Step 2: Ask Time Range

Use AskUserQuestion to let the user choose how far back to look.

```
AskUserQuestion:
  questions:
    - question: "어떤 기간의 AI 뉴스를 볼까요?"
      header: "기간 선택"
      multiSelect: false
      options:
        - label: "오늘 (24시간)"
          description: "지난 24시간 이내 게시된 최신 뉴스"
        - label: "지난 일주일"
          description: "최근 7일간의 주요 뉴스 (Recommended)"
        - label: "지난 한달"
          description: "최근 30일간의 뉴스. 결과가 많을 수 있습니다"
```

**Map selection to --days argument:**
- "오늘 (24시간)" → `--days 1`
- "지난 일주일" → `--days 7`
- "지난 한달" → `--days 30`

---

### Step 3: Ask Category Filter

Use AskUserQuestion with multiSelect to let the user filter by source category.

```
AskUserQuestion:
  questions:
    - question: "어떤 소스의 뉴스를 볼까요?"
      header: "카테고리"
      multiSelect: true
      options:
        - label: "전체"
          description: "모든 소스에서 가져오기 (Recommended)"
        - label: "AI 도구/에이전트"
          description: "Claude Code, Copilot, LangChain, Vercel AI SDK 등 실무 도구"
        - label: "공식 블로그"
          description: "Anthropic, OpenAI, DeepMind 등 공식 발표"
        - label: "연구 논문"
          description: "ArXiv ML/AI/CL 최신 논문"
```

**Map selection to --category argument:**
- "전체" selected → `--category all` (ignore other selections)
- "AI 도구/에이전트" → `ai_tools`
- "공식 블로그" → `official`
- "연구 논문" → `research`
- "커뮤니티/뉴스" → `community,tech_news`
- Multiple selections → comma-join (e.g., `official,ai_tools`)

---

### Step 4: Check Dependencies & Fetch Data

**4-1. Check Python dependencies:**

```bash
python3 -c "import feedparser, yaml, certifi" 2>/dev/null || \
  pip3 install feedparser pyyaml certifi --quiet
```

**4-2. Inform user about fetching:**

"AI 뉴스를 가져오는 중입니다... (약 5-10초 소요됩니다)"

**Note:** The plugin now uses:
- **Parallel fetching** (much faster than before)
- **Caching** (subsequent runs within 30 min are instant)
- **Real-time progress** updates showing each feed as it completes

**4-3. Locate and run the fetch script:**

First, find the plugin directory. Check these paths in order:
1. `~/.claude/skills/ai-news-digest/../../config/fetch_news.py` (installed via symlink)
2. `plugins/ai-news-digest/config/fetch_news.py` (local development)

```bash
python3 {path_to_fetch_news.py} --days {days} --top 10 --category {category} --output json
```

The script will show real-time progress like:
```
Fetching from 17 RSS feeds (parallel)...
[1/17] OpenAI News... ✓ (12 articles)
[2/17] DeepMind Blog... ✓ (8 articles)
...
Total articles found: 145
```

**Error handling:**
- If script not found: inform user of the path issue
- If script fails: show error and suggest checking internet connection
- If no results: suggest expanding the time range

---

### Step 4.5: Analyze and Show Trending Topics (Optional)

After fetching data successfully, you can optionally show trending topics:

```python
from config.trend_analyzer import TrendAnalyzer

analyzer = TrendAnalyzer()
trends = analyzer.analyze_trends(all_entries, top_n=5)

if trends:
    print("\n## 이번 주 AI 뉴스 트렌드:")
    for trend in trends:
        print(f"- **{trend['term']}** ({trend['count']}개 기사)")
        if trend['example_articles']:
            example = trend['example_articles'][0]
            print(f"  예: {example['title']} ({example['source']})")
```

**Example output:**
```
## 이번 주 AI 뉴스 트렌드:
- **AI agent** (8개 기사)
  예: New autonomous agents from OpenAI (OpenAI News)
- **Claude 4** (5개 기사)
  예: Claude 4 benchmarks released (Anthropic Engineering)
- **RAG** (4개 기사)
  예: Improving RAG with vector databases (LangChain Blog)
```

---

### Step 5: Display Results in Terminal

Parse the JSON output and display results directly in the terminal. **DO NOT save to a file yet.**

Format each entry as:

```
**IMPORTANT**: Run `date '+%Y-%m-%d %H:%M'` to get the exact current date/time. Never estimate.

## AI News Top 10 — {today's date} (최근 {period})

---

**1. {Title}** (Score: {score})
{Source} | {Published date}
{Summary (first 200 chars)}
Link: {url}

---

**2. {Title}** (Score: {score})
{Source} | {Published date}
{Summary (first 200 chars)}
Link: {url}

---

... (up to 10 items)
```

**Display rules:**
- Number each item clearly (1-10)
- Show score for reference
- Keep summary concise (max ~200 chars)
- Include the link for each item
- If fewer than 10 results, show all available

After displaying all results, proceed to Step 6.

---

### Step 6: Ask What to Save

After displaying the list, ask the user in plain text:

**Output this exact message:**

"저장할 뉴스가 있다면 번호로 알려주세요. (예: 1, 3, 7)"
"없으면 '없음'이라고 해주세요."

**Wait for user response.** The user may respond in various formats:
- "2, 5번 저장해줘" → save items 2 and 5
- "1,3,7" → save items 1, 3, 7
- "전부 저장" or "all" → save all items
- "없음" or "없어" or "no" → skip saving, go to Step 7 with no-save path

**Parse the numbers from the response.** Extract all digits that correspond to displayed item numbers.

---

### Step 7: Save Selected Items (or Skip)

**If user said "없음" / no save:**
- Output: "알겠습니다. 저장 없이 마무리합니다. 다음에 또 AI 뉴스가 필요하면 말씀해주세요!"
- End execution.

**If user selected specific items:**

**7-1. Determine save location:**
- Read `~/.claude/skills/learning-summary/config.yaml`
- If `learning_repo` is configured: save to `{learning_repo}/digests/ai-news-digest-YYYY-MM-DD.md`
- Otherwise: save to current directory as `./ai-news-digest-YYYY-MM-DD.md`

**7-2. Generate markdown for selected items only:**

```markdown
# AI News Digest - YYYY-MM-DD

> **Generated**: YYYY-MM-DD HH:MM
> **Period**: Last {N} days
> **Categories**: {selected categories}
> **Saved items**: {count} of {total}

---

## 1. {Title}

**Source**: {Source} | **Published**: YYYY-MM-DD | **Score**: {Score}

{Full summary}

**Key Points**:
- {Extracted key point 1}
- {Extracted key point 2}

**Why It Matters**: {Brief significance analysis}

**Read More**: {Link}

---

## 2. {Title}
...
```

**7-3. Save using Write tool.**

**7-4. Confirm to user:**

```
Saved {N}개 뉴스를 저장했습니다: {file_path}

저장된 항목:
- 1. {Title}
- 2. {Title}

다음에 또 AI 뉴스가 필요하면 말씀해주세요!
```

---

## Trigger Phrases

**English:**
- "latest AI news"
- "AI news digest"
- "what's new in AI"
- "fetch AI news"
- "get latest AI developments"

**Korean:**
- "최신 AI 뉴스"
- "AI 뉴스 정리"
- "AI 소식"
- "AI 업데이트"

---

## Configuration

### RSS Feed Sources (config/feeds.yaml)

**Official Blogs** (weight: 9-10):
- OpenAI, DeepMind, Anthropic (community feed)

**Research Papers** (weight: 8):
- ArXiv (ML, AI, CL)

**Community** (weight: 6):
- Hacker News, Reddit (MachineLearning, LocalLLaMA)

**Tech News** (weight: 5):
- The Verge, TechCrunch

### Scoring System

**Final Score** = Base Weight + Keyword Boost + Recency Boost

### User Preferences (config/user_preferences.yaml - Optional)

Power users can create a `user_preferences.yaml` file to customize defaults:

```yaml
default_time_range: 7  # Skip time range question
default_categories: "all"  # Skip category question
default_top_n: 10

favorite_sources:  # Get +2 weight boost
  - "OpenAI News"
  - "Anthropic Engineering (Community)"

excluded_sources: []  # Skip these feeds entirely

performance:
  max_workers: 5  # Parallel fetch workers
  cache_ttl_minutes: 30  # Cache duration
```

**Benefits:**
- Skip repetitive questions for frequent users
- Boost favorite sources automatically
- Control caching and performance settings

---

## Quick Reference

### When to Use

**Use when:**
- Catching up on AI news
- Daily/weekly briefing
- Browsing and selectively saving interesting news

**Skip when:**
- Asking about a specific article (use `ai-digest` instead)
- Very old news (> 1 month)

---

## Error Handling

| Scenario | Response |
|----------|----------|
| Python missing | Install or inform user |
| No internet | Show error message |
| No results | Suggest expanding time range |
| Script not found | Check plugin installation path |
| User gives invalid numbers | Ask again with valid range |

---

## Examples

### Example 1: Default Flow

```
User: "최신 AI 뉴스"
→ AskUserQuestion: 기간 선택
User: "지난 일주일"
→ AskUserQuestion: 카테고리 선택
User: "전체"
→ Fetch & display Top 10 in terminal
→ "저장할 뉴스 번호를 알려주세요"
User: "2, 5번 저장해줘"
→ Save items 2, 5 as markdown
→ Confirm saved path
```

### Example 2: Filtered + No Save

```
User: "AI 뉴스 보여줘"
→ AskUserQuestion: 기간 선택
User: "오늘 (24시간)"
→ AskUserQuestion: 카테고리 선택
User: "공식 블로그"
→ Fetch & display results (official only, last 24h)
→ "저장할 뉴스 번호를 알려주세요"
User: "없음"
→ End without saving
```

### Example 3: Save All

```
User: "AI news digest"
→ AskUserQuestion: 기간
User: "지난 한달"
→ AskUserQuestion: 카테고리
User: "연구 논문", "공식 블로그"
→ Fetch & display (research + official, last 30 days)
→ "저장할 뉴스 번호를 알려주세요"
User: "전부 저장"
→ Save all items as markdown
```

---

## Performance

**First run (no cache):**
- RSS fetching (parallel): 5-8 seconds
- Scoring & deduplication: <1 second
- Total: ~6-10 seconds

**Subsequent runs (with cache, within 30 min):**
- Cache retrieval: <1 second
- Total: ~1-2 seconds

**Improvements from v1.0:**
- 63% faster initial fetch (parallel execution)
- ~95% faster subsequent fetches (caching)
- Better accuracy (fuzzy duplicate detection, overlap-free keyword scoring)

---

## Dependencies

```bash
pip3 install feedparser pyyaml certifi
```

**certifi** provides Mozilla's CA certificate bundle for secure SSL/TLS verification.

---

## Related Skills

- `ai-digest`: Detailed analysis of individual articles (use for deep-dive after browsing)
- `learning-summary`: Document insights from learning sessions

