[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GS1CDVNXQGDQQ96C32XZS6":3,"skill-same:01M6GS1CDVNXQGDQQ96C32XZS6":65},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":15,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":23,"linkOnly":24,"markdownContent":25,"markdownBody":26,"frontMatter":27,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":35,"updatedAt":36,"install":37,"resources":50},"01M6GS1CDVNXQGDQQ96C32XZS6","erhnysr-turkish-news",null,"jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fdev-tools\u002Ferhnysr-turkish-news\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fdev-tools\u002Ferhnysr-turkish-news\u002FSKILL.md",[],[19,20,21,22],"news","turkish","turkish news","erhnysr turkish news","2026-11-10 10:12:30",false,"---\nname: turkish-news\nversion: 1.0.0\ndescription: \"Türk haber kaynaklarından (Hürriyet, Sabah, Bloomberg HT, CoinTelegraph TR, NTV, AA) gerçek zamanlı haber toplama ve özetleme. \u002F Real-time Turkish news aggregation and summarization from major Turkish media sources.\"\ntags: [turkish, news, rss, hurriyet, sabah, bloomberg-ht, cointelegraph, ntv, aa]\nauthor: Hermes Agent Hackathon 2026\ntriggers:\n  - user asks for Turkish news\n  - \"türkiye haberleri\", \"gündem\", \"son dakika\", \"manşetler\"\n  - \"bugünün haberleri\", \"haber özetle\"\n  - \"Bloomberg HT\", \"kripto haberleri\"\n---\n\n# ? Turkish News \u002F Türk Haberleri\n\n> Aggregate, filter, and summarize news from Turkey's top media sources.\n> Türkiye'nin önde gelen medya kaynaklarından haberleri topla, filtrele ve özetle.\n\n---\n\n## When To Use \u002F Ne Zaman Kullanılır\n\n- User asks for Turkish news in any form\n- User mentions specific Turkish news sources\n- User wants news about Turkey, Turkish economy, Turkish politics\n- User asks \"gündem ne?\", \"son dakika var mı?\", \"bugün ne oldu?\"\n- Part of the daily brief pipeline (called by turkish-daily-brief)\n\n---\n\n## Sources & RSS Feeds \u002F Kaynaklar ve RSS Beslemeleri\n\n### Primary Sources \u002F Ana Kaynaklar\n\n#### 1. Hürriyet — Genel Haber\n```\nMain:      https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fanasayfa\nGündem:    https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fgundem\nEkonomi:   https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fekonomi\nDünya:     https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fdunya\nTeknoloji: https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fteknoloji\nSpor:      https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fspor\n```\n\n#### 2. Sabah — Genel Haber\n```\nMain:      https:\u002F\u002Fwww.sabah.com.tr\u002Frss\u002Fanasayfa.xml\nGündem:    https:\u002F\u002Fwww.sabah.com.tr\u002Frss\u002Fgundem.xml\nEkonomi:   https:\u002F\u002Fwww.sabah.com.tr\u002Frss\u002Fekonomi.xml\nDünya:     https:\u002F\u002Fwww.sabah.com.tr\u002Frss\u002Fdunya.xml\nTeknoloji: https:\u002F\u002Fwww.sabah.com.tr\u002Frss\u002Fteknoloji.xml\n```\n\n#### 3. Bloomberg HT — Finans & Ekonomi\n```\nMain:      https:\u002F\u002Fwww.bloomberght.com\u002Frss\nPiyasa:    https:\u002F\u002Fwww.bloomberght.com\u002Frss\u002Fpiyasa\nHaberler:  https:\u002F\u002Fwww.bloomberght.com\u002Frss\u002Fhaberler\n```\n\n#### 4. CoinTelegraph TR — Kripto Para\n```\nMain:      https:\u002F\u002Ftr.cointelegraph.com\u002Frss\n```\n\n#### 5. NTV — Genel Haber\n```\nMain:      https:\u002F\u002Fwww.ntv.com.tr\u002Fson-dakika.rss\nGündem:    https:\u002F\u002Fwww.ntv.com.tr\u002Fturkiye.rss\nEkonomi:   https:\u002F\u002Fwww.ntv.com.tr\u002Fekonomi.rss\nDünya:     https:\u002F\u002Fwww.ntv.com.tr\u002Fdunya.rss\nTeknoloji: https:\u002F\u002Fwww.ntv.com.tr\u002Fteknoloji.rss\n```\n\n#### 6. Anadolu Ajansı (AA) — Haber Ajansı\n```\nMain:      https:\u002F\u002Fwww.aa.com.tr\u002Ftr\u002Frss\u002Fdefault?cat=guncel\nEkonomi:   https:\u002F\u002Fwww.aa.com.tr\u002Ftr\u002Frss\u002Fdefault?cat=ekonomi\nDünya:     https:\u002F\u002Fwww.aa.com.tr\u002Ftr\u002Frss\u002Fdefault?cat=dunya\nSpor:      https:\u002F\u002Fwww.aa.com.tr\u002Ftr\u002Frss\u002Fdefault?cat=spor\n```\n\n### Supplementary Sources \u002F Ek Kaynaklar\n\n#### 7. TRT Haber — Kamu Yayıncılığı\n```\nMain:      https:\u002F\u002Fwww.trthaber.com\u002Fsondakika.rss\n```\n\n#### 8. Dünya Gazetesi — Ekonomi Odaklı\n```\nMain:      https:\u002F\u002Fwww.dunya.com\u002Frss\n```\n\n---\n\n## Procedures \u002F İşlem Adımları\n\n### Procedure 1: Quick News Summary \u002F Hızlı Haber Özeti\n\n**Trigger:** \"Gündem ne?\", \"Haberleri özetle\", \"Bugün ne oldu?\"\n\nSteps:\n1. Fetch RSS feeds from top 3 sources (Hürriyet, NTV, Bloomberg HT)\n2. Parse XML to extract title, link, pubDate, description\n3. Deduplicate by similarity (same story from multiple sources)\n4. Sort by recency (newest first)\n5. Take top 10 unique stories\n6. Summarize each in 1-2 sentences in Turkish\n7. Format as numbered list with source attribution\n\n**Implementation:**\n\n```python\nfrom hermes_tools import web_extract, terminal\nimport json\n\n# Fetch RSS feeds via curl (faster than web_extract for XML)\nsources = {\n    \"Hürriyet\": \"https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fanasayfa\",\n    \"NTV\": \"https:\u002F\u002Fwww.ntv.com.tr\u002Fson-dakika.rss\",\n    \"Bloomberg HT\": \"https:\u002F\u002Fwww.bloomberght.com\u002Frss\",\n}\n\nall_items = []\nfor name, url in sources.items():\n    result = terminal(f\"curl -s -m 10 '{url}' | python3 -c \\\"\\nimport sys, xml.etree.ElementTree as ET\\ntry:\\n    tree = ET.parse(sys.stdin)\\n    for item in tree.findall('.\u002F\u002Fitem')[:10]:\\n        title = item.findtext('title', '')\\n        link = item.findtext('link', '')\\n        desc = item.findtext('description', '')\\n        date = item.findtext('pubDate', '')\\n        print(f'{{\\\\\\\"title\\\\\\\": \\\\\\\"{title}\\\\\\\", \\\\\\\"link\\\\\\\": \\\\\\\"{link}\\\\\\\", \\\\\\\"source\\\\\\\": \\\\\\\"{name}\\\\\\\"}}')\\nexcept: pass\\n\\\"\")\n    # Parse results...\n\n# Present to user as formatted Turkish summary\n```\n\n**Output Format:**\n\n```\n? GÜNÜN MANŞETLERİ — 11 Mart 2026\n\n1. [Başlık] — kaynak\n   Kısa özet...\n\n2. [Başlık] — kaynak\n   Kısa özet...\n\n...\n\n? Son güncelleme: 08:30\n```\n\n### Procedure 2: Category-Specific News \u002F Kategoriye Özel Haberler\n\n**Trigger:** \"Ekonomi haberleri\", \"Spor haberleri\", \"Kripto haberleri\", \"Dünya haberleri\"\n\nSteps:\n1. Detect category from user input:\n   - ekonomi\u002Ffinans → Ekonomi RSS feeds\n   - spor → Spor RSS feeds\n   - kripto\u002Fbitcoin → CoinTelegraph TR\n   - dünya\u002Fuluslararası → Dünya RSS feeds\n   - teknoloji → Teknoloji RSS feeds\n2. Fetch category-specific RSS from 2-3 sources\n3. Parse, deduplicate, sort by recency\n4. Take top 8 stories\n5. Format with category header\n\n**Category Mapping:**\n```\nekonomi  → hurriyet\u002Fekonomi + bloomberght\u002Fpiyasa + sabah\u002Fekonomi\nspor     → hurriyet\u002Fspor + ntv\u002Fspor + aa\u002Fspor\nkripto   → tr.cointelegraph.com\u002Frss\ndünya    → hurriyet\u002Fdunya + ntv\u002Fdunya + aa\u002Fdunya\nteknoloji → hurriyet\u002Fteknoloji + ntv\u002Fteknoloji + sabah\u002Fteknoloji\ngündem   → hurriyet\u002Fgundem + ntv\u002Fturkiye + aa\u002Fguncel\n```\n\n### Procedure 3: Deep Dive on a Story \u002F Haberi Derinlemesine İncele\n\n**Trigger:** User asks for details on a specific news story\n\nSteps:\n1. Use web_extract on the article URL\n2. Extract full article text\n3. Summarize key points in Turkish\n4. Provide context if needed (related events, background)\n5. Offer to find related stories from other sources\n\n### Procedure 4: Source-Specific Fetch \u002F Kaynağa Özel Çekme\n\n**Trigger:** \"Bloomberg HT'den haberleri getir\", \"Hürriyet manşetleri\"\n\nSteps:\n1. Identify the requested source\n2. Fetch all available RSS categories from that source\n3. Parse and present with source branding\n4. Use source-appropriate formatting (e.g., Bloomberg HT gets financial emphasis)\n\n---\n\n## RSS Parsing Helper \u002F RSS Ayrıştırma Yardımcısı\n\nStandard approach for all RSS fetches:\n\n```python\nimport xml.etree.ElementTree as ET\nfrom datetime import datetime\n\ndef parse_rss(xml_content, source_name, max_items=10):\n    \"\"\"Parse RSS XML and return structured items.\"\"\"\n    items = []\n    try:\n        root = ET.fromstring(xml_content)\n        for item in root.findall('.\u002F\u002Fitem')[:max_items]:\n            items.append({\n                'title': (item.findtext('title') or '').strip(),\n                'link': (item.findtext('link') or '').strip(),\n                'description': (item.findtext('description') or '').strip(),\n                'pub_date': (item.findtext('pubDate') or '').strip(),\n                'source': source_name,\n            })\n    except ET.ParseError:\n        pass\n    return items\n\ndef deduplicate(items, threshold=0.6):\n    \"\"\"Remove duplicate stories across sources by title similarity.\"\"\"\n    seen = []\n    unique = []\n    for item in items:\n        title_words = set(item['title'].lower().split())\n        is_dupe = False\n        for seen_words in seen:\n            overlap = len(title_words & seen_words) \u002F max(len(title_words | seen_words), 1)\n            if overlap > threshold:\n                is_dupe = True\n                break\n        if not is_dupe:\n            seen.append(title_words)\n            unique.append(item)\n    return unique\n```\n\n---\n\n## Output Templates \u002F Çıktı Şablonları\n\n### Compact Format (for Telegram \u002F CLI):\n```\n? TÜRKİYE GÜNDEMİ — {tarih}\n\n1. {başlık} [{kaynak}]\n2. {başlık} [{kaynak}]\n3. {başlık} [{kaynak}]\n...\n\n? Detay için numara söyle\n```\n\n### Detailed Format (for full response):\n```\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n  ? {KATEGORI} HABERLERİ\n  {tarih} • {saat}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n▸ {başlık}\n  {kaynak} • {zaman}\n  {özet}\n  ? {link}\n\n▸ {başlık}\n  {kaynak} • {zaman}\n  {özet}\n  ? {link}\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n  Toplam {n} haber • Son güncelleme: {saat}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n```\n\n---\n\n## Error Handling \u002F Hata Yönetimi\n\n- If RSS feed is unreachable: skip source, note in output, try alternatives\n- If all feeds fail: fall back to web_extract on source homepages\n- If content is paywalled: extract available preview text, note \"tam içerik ücretli\"\n- Rate limiting: wait 1s between requests, max 3 concurrent fetches\n- Timeout: 10s per RSS feed, 15s per web_extract\n\n---\n\n## Pitfalls \u002F Dikkat Edilecekler\n\n1. **Encoding:** Turkish chars (ç, ğ, ı, İ, ö, ş, ü) must be preserved — always use UTF-8\n2. **RSS availability:** Some sources may change\u002Fbreak RSS URLs — fall back to web scraping\n3. **Deduplication:** Turkish news outlets often run same AA wire stories — always deduplicate\n4. **Time zones:** All Turkish sources use UTC+3 (Europe\u002FIstanbul) — normalize timestamps\n5. **Content length:** RSS descriptions may be truncated — use web_extract for full articles\n6. **Political sensitivity:** Present news factually without editorial commentary\n","# ? Turkish News \u002F Türk Haberleri\n\n> Aggregate, filter, and summarize news from Turkey's top media sources.\n> Türkiye'nin önde gelen medya kaynaklarından haberleri topla, filtrele ve özetle.\n\n---\n\n## When To Use \u002F Ne Zaman Kullanılır\n\n- User asks for Turkish news in any form\n- User mentions specific Turkish news sources\n- User wants news about Turkey, Turkish economy, Turkish politics\n- User asks \"gündem ne?\", \"son dakika var mı?\", \"bugün ne oldu?\"\n- Part of the daily brief pipeline (called by turkish-daily-brief)\n\n---\n\n## Sources & RSS Feeds \u002F Kaynaklar ve RSS Beslemeleri\n\n### Primary Sources \u002F Ana Kaynaklar\n\n#### 1. Hürriyet — Genel Haber\n```\nMain:      https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fanasayfa\nGündem:    https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fgundem\nEkonomi:   https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fekonomi\nDünya:     https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fdunya\nTeknoloji: https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fteknoloji\nSpor:      https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fspor\n```\n\n#### 2. Sabah — Genel Haber\n```\nMain:      https:\u002F\u002Fwww.sabah.com.tr\u002Frss\u002Fanasayfa.xml\nGündem:    https:\u002F\u002Fwww.sabah.com.tr\u002Frss\u002Fgundem.xml\nEkonomi:   https:\u002F\u002Fwww.sabah.com.tr\u002Frss\u002Fekonomi.xml\nDünya:     https:\u002F\u002Fwww.sabah.com.tr\u002Frss\u002Fdunya.xml\nTeknoloji: https:\u002F\u002Fwww.sabah.com.tr\u002Frss\u002Fteknoloji.xml\n```\n\n#### 3. Bloomberg HT — Finans & Ekonomi\n```\nMain:      https:\u002F\u002Fwww.bloomberght.com\u002Frss\nPiyasa:    https:\u002F\u002Fwww.bloomberght.com\u002Frss\u002Fpiyasa\nHaberler:  https:\u002F\u002Fwww.bloomberght.com\u002Frss\u002Fhaberler\n```\n\n#### 4. CoinTelegraph TR — Kripto Para\n```\nMain:      https:\u002F\u002Ftr.cointelegraph.com\u002Frss\n```\n\n#### 5. NTV — Genel Haber\n```\nMain:      https:\u002F\u002Fwww.ntv.com.tr\u002Fson-dakika.rss\nGündem:    https:\u002F\u002Fwww.ntv.com.tr\u002Fturkiye.rss\nEkonomi:   https:\u002F\u002Fwww.ntv.com.tr\u002Fekonomi.rss\nDünya:     https:\u002F\u002Fwww.ntv.com.tr\u002Fdunya.rss\nTeknoloji: https:\u002F\u002Fwww.ntv.com.tr\u002Fteknoloji.rss\n```\n\n#### 6. Anadolu Ajansı (AA) — Haber Ajansı\n```\nMain:      https:\u002F\u002Fwww.aa.com.tr\u002Ftr\u002Frss\u002Fdefault?cat=guncel\nEkonomi:   https:\u002F\u002Fwww.aa.com.tr\u002Ftr\u002Frss\u002Fdefault?cat=ekonomi\nDünya:     https:\u002F\u002Fwww.aa.com.tr\u002Ftr\u002Frss\u002Fdefault?cat=dunya\nSpor:      https:\u002F\u002Fwww.aa.com.tr\u002Ftr\u002Frss\u002Fdefault?cat=spor\n```\n\n### Supplementary Sources \u002F Ek Kaynaklar\n\n#### 7. TRT Haber — Kamu Yayıncılığı\n```\nMain:      https:\u002F\u002Fwww.trthaber.com\u002Fsondakika.rss\n```\n\n#### 8. Dünya Gazetesi — Ekonomi Odaklı\n```\nMain:      https:\u002F\u002Fwww.dunya.com\u002Frss\n```\n\n---\n\n## Procedures \u002F İşlem Adımları\n\n### Procedure 1: Quick News Summary \u002F Hızlı Haber Özeti\n\n**Trigger:** \"Gündem ne?\", \"Haberleri özetle\", \"Bugün ne oldu?\"\n\nSteps:\n1. Fetch RSS feeds from top 3 sources (Hürriyet, NTV, Bloomberg HT)\n2. Parse XML to extract title, link, pubDate, description\n3. Deduplicate by similarity (same story from multiple sources)\n4. Sort by recency (newest first)\n5. Take top 10 unique stories\n6. Summarize each in 1-2 sentences in Turkish\n7. Format as numbered list with source attribution\n\n**Implementation:**\n\n```python\nfrom hermes_tools import web_extract, terminal\nimport json\n\n# Fetch RSS feeds via curl (faster than web_extract for XML)\nsources = {\n    \"Hürriyet\": \"https:\u002F\u002Fwww.hurriyet.com.tr\u002Frss\u002Fanasayfa\",\n    \"NTV\": \"https:\u002F\u002Fwww.ntv.com.tr\u002Fson-dakika.rss\",\n    \"Bloomberg HT\": \"https:\u002F\u002Fwww.bloomberght.com\u002Frss\",\n}\n\nall_items = []\nfor name, url in sources.items():\n    result = terminal(f\"curl -s -m 10 '{url}' | python3 -c \\\"\\nimport sys, xml.etree.ElementTree as ET\\ntry:\\n    tree = ET.parse(sys.stdin)\\n    for item in tree.findall('.\u002F\u002Fitem')[:10]:\\n        title = item.findtext('title', '')\\n        link = item.findtext('link', '')\\n        desc = item.findtext('description', '')\\n        date = item.findtext('pubDate', '')\\n        print(f'{{\\\\\\\"title\\\\\\\": \\\\\\\"{title}\\\\\\\", \\\\\\\"link\\\\\\\": \\\\\\\"{link}\\\\\\\", \\\\\\\"source\\\\\\\": \\\\\\\"{name}\\\\\\\"}}')\\nexcept: pass\\n\\\"\")\n    # Parse results...\n\n# Present to user as formatted Turkish summary\n```\n\n**Output Format:**\n\n```\n? GÜNÜN MANŞETLERİ — 11 Mart 2026\n\n1. [Başlık] — kaynak\n   Kısa özet...\n\n2. [Başlık] — kaynak\n   Kısa özet...\n\n...\n\n? Son güncelleme: 08:30\n```\n\n### Procedure 2: Category-Specific News \u002F Kategoriye Özel Haberler\n\n**Trigger:** \"Ekonomi haberleri\", \"Spor haberleri\", \"Kripto haberleri\", \"Dünya haberleri\"\n\nSteps:\n1. Detect category from user input:\n   - ekonomi\u002Ffinans → Ekonomi RSS feeds\n   - spor → Spor RSS feeds\n   - kripto\u002Fbitcoin → CoinTelegraph TR\n   - dünya\u002Fuluslararası → Dünya RSS feeds\n   - teknoloji → Teknoloji RSS feeds\n2. Fetch category-specific RSS from 2-3 sources\n3. Parse, deduplicate, sort by recency\n4. Take top 8 stories\n5. Format with category header\n\n**Category Mapping:**\n```\nekonomi  → hurriyet\u002Fekonomi + bloomberght\u002Fpiyasa + sabah\u002Fekonomi\nspor     → hurriyet\u002Fspor + ntv\u002Fspor + aa\u002Fspor\nkripto   → tr.cointelegraph.com\u002Frss\ndünya    → hurriyet\u002Fdunya + ntv\u002Fdunya + aa\u002Fdunya\nteknoloji → hurriyet\u002Fteknoloji + ntv\u002Fteknoloji + sabah\u002Fteknoloji\ngündem   → hurriyet\u002Fgundem + ntv\u002Fturkiye + aa\u002Fguncel\n```\n\n### Procedure 3: Deep Dive on a Story \u002F Haberi Derinlemesine İncele\n\n**Trigger:** User asks for details on a specific news story\n\nSteps:\n1. Use web_extract on the article URL\n2. Extract full article text\n3. Summarize key points in Turkish\n4. Provide context if needed (related events, background)\n5. Offer to find related stories from other sources\n\n### Procedure 4: Source-Specific Fetch \u002F Kaynağa Özel Çekme\n\n**Trigger:** \"Bloomberg HT'den haberleri getir\", \"Hürriyet manşetleri\"\n\nSteps:\n1. Identify the requested source\n2. Fetch all available RSS categories from that source\n3. Parse and present with source branding\n4. Use source-appropriate formatting (e.g., Bloomberg HT gets financial emphasis)\n\n---\n\n## RSS Parsing Helper \u002F RSS Ayrıştırma Yardımcısı\n\nStandard approach for all RSS fetches:\n\n```python\nimport xml.etree.ElementTree as ET\nfrom datetime import datetime\n\ndef parse_rss(xml_content, source_name, max_items=10):\n    \"\"\"Parse RSS XML and return structured items.\"\"\"\n    items = []\n    try:\n        root = ET.fromstring(xml_content)\n        for item in root.findall('.\u002F\u002Fitem')[:max_items]:\n            items.append({\n                'title': (item.findtext('title') or '').strip(),\n                'link': (item.findtext('link') or '').strip(),\n                'description': (item.findtext('description') or '').strip(),\n                'pub_date': (item.findtext('pubDate') or '').strip(),\n                'source': source_name,\n            })\n    except ET.ParseError:\n        pass\n    return items\n\ndef deduplicate(items, threshold=0.6):\n    \"\"\"Remove duplicate stories across sources by title similarity.\"\"\"\n    seen = []\n    unique = []\n    for item in items:\n        title_words = set(item['title'].lower().split())\n        is_dupe = False\n        for seen_words in seen:\n            overlap = len(title_words & seen_words) \u002F max(len(title_words | seen_words), 1)\n            if overlap > threshold:\n                is_dupe = True\n                break\n        if not is_dupe:\n            seen.append(title_words)\n            unique.append(item)\n    return unique\n```\n\n---\n\n## Output Templates \u002F Çıktı Şablonları\n\n### Compact Format (for Telegram \u002F CLI):\n```\n? TÜRKİYE GÜNDEMİ — {tarih}\n\n1. {başlık} [{kaynak}]\n2. {başlık} [{kaynak}]\n3. {başlık} [{kaynak}]\n...\n\n? Detay için numara söyle\n```\n\n### Detailed Format (for full response):\n```\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n  ? {KATEGORI} HABERLERİ\n  {tarih} • {saat}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n▸ {başlık}\n  {kaynak} • {zaman}\n  {özet}\n  ? {link}\n\n▸ {başlık}\n  {kaynak} • {zaman}\n  {özet}\n  ? {link}\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n  Toplam {n} haber • Son güncelleme: {saat}\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n```\n\n---\n\n## Error Handling \u002F Hata Yönetimi\n\n- If RSS feed is unreachable: skip source, note in output, try alternatives\n- If all feeds fail: fall back to web_extract on source homepages\n- If content is paywalled: extract available preview text, note \"tam içerik ücretli\"\n- Rate limiting: wait 1s between requests, max 3 concurrent fetches\n- Timeout: 10s per RSS feed, 15s per web_extract\n\n---\n\n## Pitfalls \u002F Dikkat Edilecekler\n\n1. **Encoding:** Turkish chars (ç, ğ, ı, İ, ö, ş, ü) must be preserved — always use UTF-8\n2. **RSS availability:** Some sources may change\u002Fbreak RSS URLs — fall back to web scraping\n3. **Deduplication:** Turkish news outlets often run same AA wire stories — always deduplicate\n4. **Time zones:** All Turkish sources use UTC+3 (Europe\u002FIstanbul) — normalize timestamps\n5. **Content length:** RSS descriptions may be truncated — use web_extract for full articles\n6. **Political sensitivity:** Present news factually without editorial commentary\n",{},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fdev-tools\u002Ferhnysr-turkish-news",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-15 02:28:10",{"source":7,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill erhnysr-turkish-news",{"tool":43,"command":44},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill erhnysr-turkish-news",{"tool":46,"command":47},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill erhnysr-turkish-news","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fdev-tools\u002Ferhnysr-turkish-news\u002FSKILL.md",true,[51,55,61],{"path":52,"resourceType":52,"resourceTypeDesc":53,"sizeBytes":54,"sourceHtmlUrl":15},"LICENSE","许可证",1068,{"path":56,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":59,"sourceHtmlUrl":60},"SOURCE.md","REFERENCE","参考文档",350,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fdev-tools\u002Ferhnysr-turkish-news\u002FSOURCE.md",{"path":62,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":63,"sourceHtmlUrl":64},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fdev-tools\u002Ferhnysr-turkish-news\u002FTRUST.auto.yaml",[66,94,117,135,148,158],{"skillNo":67,"name":68,"nameZh":6,"description":69,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":70,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":23},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":98,"licenseFileUrl":99,"sourceHtmlUrl":100,"categories":101,"keywords":102,"publishedAt":23},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[103,104,105,106,107,108,109,110,111,112,113,114,115,116],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":98,"licenseFileUrl":121,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":23},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[125,104,126,127,128,129,130,114,113,112,131,132,133,108,134,107,106],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":98,"licenseFileUrl":139,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":23},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[143,144,105,145,146,115,113,147,111,110,108,107],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":149,"name":150,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":151,"sourceHtmlUrl":152,"categories":153,"keywords":154,"publishedAt":23},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[155,156,157],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":162,"sourceHtmlUrl":163,"categories":164,"keywords":165,"publishedAt":23},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[166,167,168,169,170,171,172,173,174,175,176],"tests","cover","verify tests cover changed lines","verify","coverage","pr","exercise","use","patch","code","share"]