daily-news
npx skills add https://github.com/eze-is/eze-skills --skill daily-news
Agent 安装分布
Skill 文档
Daily News
ä¸é¶æ®µå·¥ä½æµï¼è·åå æ°æ® â çææè¦ â è¾åºæ¥æ¥
å·¥ä½ç®å½
馿¬¡è¿è¡è¯¢é®å·¥ä½ç®å½è·¯å¾ï¼å¦ ~/daily-newsï¼ï¼åç»è®°ä½ã
<workspace>/
âââ profile.yaml # ç¨æ·ç»åï¼å
³äºæãå
³æ³¨ä»ä¹ï¼
âââ settings.yaml # æ¥æ¥è®¾ç½®ï¼è¯è¨ãæ ¼å¼å好ï¼
âââ methods/ # ä¿¡æºè·åæ¹æ³
âââ data/news.db # SQLite æ°æ®åº
âââ output/YYYY-MM-DD.md # æ¥æ¥è¾åº
åå§åï¼
mkdir -p <workspace>/methods <workspace>/data <workspace>/output
cp references/examples/settings.example.yaml <workspace>/settings.yaml
cp references/examples/profile.example.yaml <workspace>/profile.yaml
python3 scripts/db.py init --db <workspace>/data/news.db
åå§å宿åï¼è¯¢é®ç¨æ·æ¯å¦éè¦è°æ´ç»åã
é¶æ®µ 0ï¼éæ©æåæ¥æèå´ï¼æ°å¢ï¼
卿§è¡æååï¼è¯¢é®ç¨æ·æ¥æèå´ï¼ä»æºå¤´åå°éå¿ è¦å·¥ä½éã
æ¥æèå´é项
è¯·éæ©æåæ¶é´èå´ï¼
1. ä»å¤©ï¼é»è®¤ï¼ â published_at >= ä»å¤©
2. æ¨å¤© â published_at >= æ¨å¤©
3. æè¿3天 â published_at >= 3天å
4. æè¿7天 â published_at >= 7天å
5. ä»ä¸æ¬¡æåè³ä»ï¼å¢éï¼ â published_at >= last_fetched_date
6. èªå®ä¹æ¥æèå´ â è¾å
¥å¼å§æ¥æ
å¢éæåé»è¾
æ¯ä¸ªä¿¡æºç¬ç«è¿½è¸ªæåæ¥æï¼
# methods/twitter-karpathy.yaml
source_id: twitter-karpathy
...
# èªå¨ç»´æ¤çå
æ°æ®
last_fetched_date: "2026-01-27" # 䏿¬¡æåæ¥æ
last_fetched_count: 5 # 䏿¬¡æåæ°é
total_items_fetched: 127 # ç´¯è®¡æ»æ°
æ°æ®åºè®°å½ï¼
source_status表ï¼å¿«éæ¥è¯¢ä¸æ¬¡æåæ¥æsource_sync_log表ï¼è¯¦ç»åæ¥æ¥å¿
æ¥æçéæ§è¡æµç¨
# 1. è·å䏿¬¡æåæ¥æ
python3 scripts/db.py source-status --db <db> --source <source_id>
# 2. æ§è¡å¢éæå
# å¨ method æ§è¡æ¶ä¼ å
¥ since åæ°
# 3. è®°å½åæ¥æ¥å¿
python3 scripts/db.py add-items-incremental \
--db <db> \
--source <source_id> \
--items '<json>' \
--since "2026-01-27"
é¶æ®µ 1ï¼è·åå æ°æ®ï¼å¢éä¼åï¼
éå <workspace>/methods/ ç®å½ï¼æ§è¡æ¯ä¸ª method æä»¶ã
å¢éæåæ£æ¥
对æ¯ä¸ª methodï¼æ§è¡åæ£æ¥ï¼
# 1. 读å method æä»¶ä¸ç last_fetched_date
python3 -c "
import yaml
with open('methods/<source>.yaml') as f:
config = yaml.safe_load(f)
print(config.get('last_fetched_date', 'never'))
"
# 2. ææ¥è¯¢æ°æ®åº
python3 scripts/db.py source-status --db <db> --source <source_id>
æ ¹æ®æ¥æèå´æ§è¡
æ åµ Aï¼method æä¸æ¬¡æ¥æï¼ä¸ç¨æ·éæ©”å¢é”
# åªæå last_fetched_date ä¹åçå
容
# å¨ method æ§è¡æ¶ä¼ å
¥ since åæ°
æ åµ Bï¼method 馿¬¡æåï¼æç¨æ·éæ©”ä»å¤©/æè¿N天”
# 使ç¨ç¨æ·æå®çæ¥æèå´
åå±å»éæºå¶
第ä¸å±ï¼æåæ¶è¿æ»¤ï¼é¶æ®µ 1ï¼
# å¨ method æ§è¡æ¶ï¼åªè¿å published_at > since çå
容
第äºå±ï¼å ¥åºåæ£æ¥ï¼é¶æ®µ 1.5ï¼
# æ¹éæ£æ¥ URL æ¯å¦å·²åå¨
python3 scripts/db.py check-existing \
--db <db> \
--urls '["url1", "url2", ...]'
# è¿åå·²åå¨ç URL å表
第ä¸å±ï¼æ°æ®åº UNIQUE 约æï¼æç»ä¿æ¤ï¼
-- items 表ç url åæ®µæ UNIQUE 约æ
INSERT INTO items ... -- éå¤ URL ä¼è§¦å IntegrityError
å ¥åºå¹¶è®°å½
python3 scripts/db.py add-items-incremental \
--db <db> \
--source <source_id> \
--items '<json>' \
--since "2026-01-27"
æ¤å½ä»¤ä¼ï¼
- æ¹éæ£æ¥ URL æ¯å¦åå¨ï¼é¢å»éï¼
- æå ¥æ°æ¡ç®
- è®°å½åæ¥æ¥å¿å°
source_sync_log表 - æ´æ°
source_status表çlast_fetched_date - æ´æ° method æä»¶çå æ°æ®å段
Browser MCP æ£æ¥ä¸èªå¨é ç½®
æ§è¡åå
æ£æ¥æ¯å¦æä¿¡æºéè¦ Browser MCPï¼extends: browser-smart æ detail_method: browserï¼ï¼
妿æï¼æ§è¡ä»¥ä¸æ£æ¥æµç¨ï¼
1. æ£æ¥ MCP æ¯å¦å·²é ç½®
# æ£æ¥ ~/.claude.json 䏿¯å¦æ browsermcp é
ç½®
grep -q '"browsermcp"' ~/.claude.json && echo "configured" || echo "not configured"
妿æªé ç½®ï¼èªå¨æ·»å ï¼
# 读åç°æé
ç½®ï¼å¨ mcpServers 䏿·»å browsermcp
# ä½¿ç¨ Python æ jq ä¿®æ¹ JSON
python3 -c "
import json
config_path = '$HOME/.claude.json'
with open(config_path, 'r') as f:
config = json.load(f)
if 'mcpServers' not in config:
config['mcpServers'] = {}
if 'browsermcp' not in config['mcpServers']:
config['mcpServers']['browsermcp'] = {
'command': 'npx',
'args': ['@browsermcp/mcp@latest'],
'type': 'stdio'
}
with open(config_path, 'w') as f:
json.dump(config, f, indent=2)
print('Browser MCP é
置已添å ï¼è¯·éå¯ Claude Code çæ')
else:
print('Browser MCP å·²é
ç½®')
"
2. æµè¯è¿æ¥ç¶æ
è°ç¨ mcp__browsermcp__browser_snapshot æµè¯è¿æ¥
å¤æç»æï¼
- è¿åå
å«
Page URL:â å·²è¿æ¥ï¼ç»§ç»æ§è¡ - è¿å
No connection to browser extensionâ æªè¿æ¥ - è¿å
mcp__browsermcp__browser_snapshot is not a functionæç±»ä¼¼é误 â MCP æªå è½½
3. æ ¹æ®ç¶æå¤ç
MCP æªå è½½ï¼åæ·»å é ç½®ï¼ï¼
Browser MCP é
置已添å ã请ï¼
1. éå¯ Claude Codeï¼Ctrl+C éåºåéæ°è¿è¡ï¼
2. éå¯å忬¡è¿è¡æ¥æ¥çæ
MCP å·²å è½½ä½æªè¿æ¥ï¼
Browser MCP æªè¿æ¥å°æµè§å¨ã请ï¼
1. å®è£
Chrome æ©å±ï¼https://chromewebstore.google.com/detail/bjfgambnhccakkhmkepdoekmckoijdlc
2. å¨ Chrome ä¸ç¹å»æ©å±å¾æ ï¼ç¹å» "Connect" æé®
3. ç¶åéæ°è¿è¡
æè
è·³è¿è¿äºä¿¡æºï¼åªå¤ç RSS/WebFetch ä¿¡æºï¼
ç¨æ·å¯éæ©è·³è¿æçå¾ è¿æ¥åç»§ç»ã
å¿
é¡»ä½¿ç¨ mcp__browsermcp__*ï¼å 为å®å¤ç¨ç¨æ·æµè§å¨çç»å½æï¼å¯è®¿é®éè¦ç»å½çå
容ãå
¶ä»æµè§å¨å·¥å
·ï¼playwright/chrome-devtoolsï¼ä¼å¯å¨ç¬ç«å®ä¾ï¼æ æ³ä½¿ç¨å·²ç»å½çè´¦å·ã
Method æ§è¡é»è¾
读å method æä»¶çå
æ°æ®ï¼æ ¹æ® extends åæ®µå³å®æ§è¡æ¹å¼ï¼
æ extendsï¼å¼ç¨éç¨æ¹æ³ï¼ï¼
# extends: rssï¼æå¿«ï¼æ RSS æºæ¶é¦éï¼
python3 references/methods/rss.py --url "<source_url>"
# extends: webfetch-smartï¼å¿«ï¼éç¨å¤§å¤æ°ç½ç«ï¼
# 读å references/methods/webfetch-smart.md ææå¼æä½
# extends: browser-smartï¼Browser MCPï¼JS渲æ/éç»å½ï¼
# 读å references/methods/browser-smart.md ææå¼æä½
# 注æï¼éè¦ç¨æ·å
ç¹å» Browser MCP æ©å±è¿æ¥
æ extendsï¼å®æ´å®å¶ï¼ï¼
*.py: ç´æ¥æ§è¡python3 <file>*.md: 读åå å®¹ï¼ææå¼æä½æµè§å¨
å ¥åº
python3 scripts/db.py add-items \
--db <workspace>/data/news.db \
--source <source_id> \
--items '<JSON>'
é¶æ®µ 2ï¼çææè¦
python3 scripts/db.py list-pending --db <workspace>/data/news.db
å¯¹æ¯æ¡å
å®¹ï¼æ ¹æ® method æä»¶ç detail_method åæ®µè·åæ£æï¼
| detail_method | è·åæ¹å¼ |
|---|---|
fetch |
WebFetch å·¥å ·ï¼å¿«ï¼ |
browser |
Browser MCPï¼æ ¢ï¼éæå¨è¿æ¥ï¼ |
| æªæå® | é»è®¤ fetch |
æ references/prompts/summary.md çææè¦ï¼æ´æ°æ°æ®åºï¼
python3 scripts/db.py update-summary \
--db <workspace>/data/news.db \
--id <item_id> \
--data '<æè¦JSON>'
é¶æ®µ 3ï¼çææ¥æ¥
python3 scripts/db.py list-today --db <workspace>/data/news.db
读å <workspace>/profile.yamlï¼æ references/prompts/report.md çææ¥æ¥ã
è¾åºå° <workspace>/output/YYYY-MM-DD.mdã
ç¨æ·ç»å
ç»åç¨äºè¯ä¼°å 容ç¸å ³åº¦ï¼èªç¶è¯è¨æè¿°ï¼æ²¡æåºå®æ ¼å¼ã
馿¬¡è®¾ç½®
åå§åæ¶å·²åå»ºç©ºç½ profile.yamlï¼è¯¢é®ç¨æ·æ¯å¦éè¦è°æ´ï¼
- ä½ æ¯åä»ä¹çï¼
- æè¿å¨å ³æ³¨ä»ä¹ï¼
- æä»ä¹ä¸æ³ççï¼
æ ¹æ®åçæ´æ° <workspace>/profile.yamlã
æ´æ°ç»å
ç¨æ·è¯´”æ´æ°ç»å”æ¶ï¼
- è¯¢é®æè¿æä»ä¹åå
- 工使¹åï¼æ°çå ´è¶£ç¹ï¼
- æ´æ° profile.yaml
ç»åæ ¼å¼
about: |
ï¼å
³äºæï¼èº«ä»½ãå·¥ä½ï¼
focus: |
ï¼å½åå
³æ³¨ï¼æè¿å¨æçè¯é¢ï¼
low_priority: |
ï¼ä¸å¤ªå
³å¿ï¼éä½ä¼å
级çå
容ï¼
æ·»å ä¿¡æº
æä¼å çº§ä¾æ¬¡å°è¯ï¼
-
æ£æ¥ RSS
- å°è¯
/feedã/rssã/atom.xmlç常è§è·¯å¾ - ææ£æ¥é¡µé¢
<link rel="alternate" type="application/rss+xml"> - æåç¨
extends: rss
- å°è¯
-
æµè¯ WebFetch
- ç¨ WebFetch å·¥å ·è·å页é¢ï¼çè½å¦æåæç« å表
- æååç¨
extends: webfetch-smart
-
ä½¿ç¨æµè§å¨
- WebFetch 失败ï¼JS 渲æ/åç¬/éç»å½ï¼
- ç¨
extends: browser-smart - ä½¿ç¨ Browser MCPï¼ç´æ¥ç¨ç¨æ·æµè§å¨çç»å½æ
å建 method æä»¶ï¼è¯¦è§ references/schemas/method.md
åèèµæ
| èµæ | è·¯å¾ | å è½½æ¶æº |
|---|---|---|
| Method è§è | references/schemas/method.md |
æ·»å ä¿¡æºæ¶ |
| æè¦æç¤ºè¯ | references/prompts/summary.md |
é¶æ®µ 2 |
| æ¥æ¥æç¤ºè¯ | references/prompts/report.md |
é¶æ®µ 3 |
| éç¨æ¹æ³ | references/methods/ |
é¶æ®µ 1ï¼è¢« extends å¼ç¨ï¼ |
| æ¥æ¥è®¾ç½®ç¤ºä¾ | references/examples/settings.example.yaml |
åå§å |
| ç»åæ ¼å¼åè | references/examples/profile.example.yaml |
åå§åæ¶ |
| ç½ç«æ¨¡æ¿ | references/website-template/ |
å建ç½ç«æ¶ |
| Method å æ°æ®ç¤ºä¾ | references/examples/method-with-metadata.example.yaml |
å¢éæåé ç½®åè |
æ°æ®åºå½ä»¤åè
å¢éæåç¸å ³
# æ¹éæ£æ¥ URL æ¯å¦å·²åå¨
python3 scripts/db.py check-existing --db <db> --urls '["url1", "url2"]'
# å¢éæ·»å æ¡ç®ï¼èªå¨è®°å½æ¥å¿ï¼
python3 scripts/db.py add-items-incremental \
--db <db> --source <id> --items '<json>' --since "2026-01-27"
# æ¥çä¿¡æºåæ¥ç¶æ
python3 scripts/db.py source-status --db <db> --source <id>
# æ¥ç忥æ¥å¿
python3 scripts/db.py sync-log --db <db> --source <id> --limit 10
æ°æ®åºè¿ç§»
# åçº§å° V2ï¼æ·»å å¢éæåæ¯æï¼
sqlite3 <db> < scripts/migrate_v2.sql
ä¾èµ
pip install pyyaml feedparser requests beautifulsoup4
æµè§å¨æ¹å¼ï¼browser-smartï¼ä½¿ç¨ Browser MCPï¼éå®è£ Chrome æ©å±ã
ç½ç«é¨ç½²ï¼å¯éï¼
æ¥æ¥çæåï¼å¯èªå¨é¨ç½²å°ç½ç«ã
å¿«éå¼å§
使ç¨å ç½®ç½ç«æ¨¡æ¿ï¼
# å¤å¶æ¨¡æ¿å°å·¥ä½ç®å½
cp -r references/website-template <workspace>/website
cd <workspace>/website
python3 build.py
ç®å½ç»æ
<workspace>/
âââ output/ # æ¥æ¥ Markdown è¾åº
âââ website/ # ç½ç«é¡¹ç®
âââ build.py # æå»ºèæ¬ï¼æ¥èªæ¨¡æ¿ï¼
âââ dist/ # çæçéæç½ç«
âââ README.md # é¨ç½²æå
模æ¿ä½ç½®
- 模æ¿è·¯å¾:
references/website-template/ - å
嫿件:
build.py– å° Markdown 转æ¢ä¸ºç»ç«¯é£æ ¼ HTMLREADME.md– é¨ç½²æå
模æ¿ç¹ç¹
- ç»ç«¯é£æ ¼ – é»è² header + ç½è²å 容åº
- ååºå¼è®¾è®¡ – éé ææºåæ¡é¢
- æ¥æå¯¼èª – æ¯æå岿¥æ¥åæ¢
- é¶ä¾èµ – 纯 Pythonï¼æ éç¬¬ä¸æ¹åº
é¨ç½²å¹³å°æ¯æ
- Cloudflare Pagesï¼æ¨èï¼
- GitHub Pages
- Vercel
- Netlify
- ä»»ä½éææç®¡æå¡
馿¬¡å建ç½ç«
éæ©”å建ç½ç«”æ¶èªå¨æ§è¡ï¼
-
å¤å¶æ¨¡æ¿:
cp -r references/website-template <workspace>/website cd <workspace>/website python3 build.py -
åå§å Git:
git init git add -A git commit -m "Initial commit" gh repo create daily-news-web --public --source=. --push -
é ç½® Cloudflare Pages:
- Build command:
python3 build.py - Build output:
dist
- Build command:
æ¥æ¥çæåçæµç¨
é¶æ®µ 3 宿åï¼æ£æ¥æ¯å¦åå¨ website ç®å½ï¼
æ åµ Aï¼website ä¸åå¨
询é®ç¨æ·æ¯å¦éè¦å建ç½ç«ï¼
æ¥æ¥å·²çæï¼output/2026-01-28.md
æ¯å¦éè¦é¨ç½²å°ç½ç«ï¼
1. æ¯ï¼å建ç½ç«ï¼Cloudflare Pagesï¼
2. å¦ï¼ä»
ä¿å Markdown
æ åµ Bï¼website å·²åå¨
询é®ç¨æ·å¦ä½æ´æ°ï¼
æ¥æ¥å·²çæï¼output/2026-01-28.md
ç½ç«æ´æ°é项ï¼
1. ç«å³æå»ºå¹¶æ¨éï¼èªå¨é¨ç½²å° Cloudflareï¼
2. ä»
æå»ºï¼ç¨åæå¨æ¨é
3. 䏿´æ°ç½ç«
èªå¨æ¨éå½ä»¤
éæ©”ç«å³æå»ºå¹¶æ¨é”æ¶æ§è¡ï¼
cd <workspace>/website
python3 build.py
git add -A
git commit -m "Add daily report for $(date +%Y-%m-%d)"
git push origin main
Cloudflare Pages æ£æµå° main 忝æ¨éåèªå¨éæ°é¨ç½²ã
æå¨æ¨éæµç¨
å¦æç¨æ·éæ©ç¨åæå¨æ¨éï¼
# éæ¶æå¨æ§è¡
cd <workspace>/website
python3 build.py # éæ°æå»ºç½ç«
git add -A
git commit -m "Add report for YYYY-MM-DD"
git push origin main # 触å Cloudflare é¨ç½²
ç½ç«é ç½®
馿¬¡å建ç½ç«æ¶éé ç½®ï¼
- GitHub ä»åºï¼æ¨é website ç®å½å° GitHub
- Cloudflare Pagesï¼
- è¿æ¥ GitHub ä»åº
- Build command:
python3 build.py - Build output:
dist
- èªå®ä¹ååï¼å¯éï¼ï¼å¨ Cloudflare Pages è®¾ç½®ä¸æ·»å
详ç»é
ç½®è§ <workspace>/website/README.md
èªå®ä¹æ¨¡æ¿
å¦éä¿®æ¹ç½ç«æ ·å¼ï¼ç¼è¾ <workspace>/website/build.py ä¸ç CSS åéã
åå§æ¨¡æ¿ä¿çå¨ references/website-template/ ä¾åèã