[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HX9HE0NETQS7SVGC01J46B":3,"skill-same:01M6HX9HE0NETQS7SVGC01J46B":74},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":52,"ownerDescription":6,"updatedAt":53,"install":54,"resources":67},"01M6HX9HE0NETQS7SVGC01J46B","news-api-integration",null,"Integrate with news APIs (GNews, NewsAPI, etc.) for aggregated news feeds. Covers headline fetching, search, and category filtering.","HKUDS\u002FAgentPilot","HKUDS","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F118165258?v=4","01M6HW8VRNZP64G0P4MVJW2KKQ","✨Data Intelligence Lab@HKU✨","01M6HW8VWZVHBRHYH3T330PFWV",7989,"MIT","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fexamples\u002Fmy-daily-monitor\u002Fskills\u002Fnews-api-integration\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40],"integration","api","api integration","news","news api integration","search","feeds","filtering","integrate","with","news feeds","for","2026-11-10 10:12:30",false,"---\nname: news-api-integration\ndescription: Integrate with news APIs (GNews, NewsAPI, etc.) for aggregated news feeds. Covers headline fetching, search, and category filtering.\n---\n\n# News API Integration\n\nMultiple news APIs available. GNews is recommended for free tier usability.\n\n## Recommended: GNews\n\n- **Docs**: https:\u002F\u002Fgnews.io\u002Fdocs\u002Fv4\n- **Base URL**: `https:\u002F\u002Fgnews.io\u002Fapi\u002Fv4`\n- **Auth**: Query param `token=API_KEY`\n- **Free tier**: 100 requests\u002Fday, 10 articles per request\n- **CORS**: Yes\n\n### Top Headlines\n\n```\nGET \u002Ftop-headlines?category=general&lang=en&max=10&token=API_KEY\n```\n\nCategories: `general`, `world`, `nation`, `business`, `technology`, `entertainment`, `sports`, `science`, `health`\n\n### Search\n\n```\nGET \u002Fsearch?q=artificial+intelligence&lang=en&max=10&token=API_KEY\n```\n\n### Response Shape\n\n```json\n{\n  \"totalArticles\": 1234,\n  \"articles\": [\n    {\n      \"title\": \"Article Title\",\n      \"description\": \"Short description...\",\n      \"content\": \"Full article content (truncated)...\",\n      \"url\": \"https:\u002F\u002Fexample.com\u002Farticle\",\n      \"image\": \"https:\u002F\u002Fexample.com\u002Fimage.jpg\",\n      \"publishedAt\": \"2024-01-15T12:00:00Z\",\n      \"source\": {\n        \"name\": \"CNN\",\n        \"url\": \"https:\u002F\u002Fcnn.com\"\n      }\n    }\n  ]\n}\n```\n\n## Alternative: NewsAPI.org\n\n- **Docs**: https:\u002F\u002Fnewsapi.org\u002Fdocs\n- **Free tier**: 100 requests\u002Fday, for development only\n- **Note**: Free plan does NOT support production use (requires paid plan for CORS from browser)\n\n```\nGET \u002Fv2\u002Ftop-headlines?country=us&apiKey=API_KEY\nGET \u002Fv2\u002Feverything?q=bitcoin&apiKey=API_KEY\n```\n\n## Other Alternatives (from public-apis)\n\n| API | Free Tier | Best For |\n|-----|-----------|----------|\n| **GNews** | 100 req\u002Fday | General news, good free tier |\n| **Currents API** | 600 req\u002Fday | Real-time news, good rate |\n| **NewsData.io** | 200 req\u002Fday | News + crypto news |\n| **The Guardian** | Unlimited (rate limited) | UK\u002Finternational news |\n| **New York Times** | 500 req\u002Fday | US news, archives |\n| **Mediastack** | 500 req\u002Fmonth | Multi-source aggregation |\n| **TheNews API** | 100 req\u002Fday | Simple aggregation |\n| **MarketAux** | 100 req\u002Fday | Financial news with sentiment |\n| **HackerNews** | No limit | Tech\u002Fstartup news (no key needed) |\n\n## Frontend Service Implementation\n\n```typescript\n\u002F\u002F src\u002Fservices\u002Fnews.ts\nimport { createCircuitBreaker } from '@\u002Futils\u002Fcircuit-breaker';\n\nexport interface NewsArticle {\n  title: string;\n  description: string;\n  url: string;\n  source: string;\n  publishedAt: string;\n  image?: string;\n}\n\nconst newsBreaker = createCircuitBreaker\u003CNewsArticle[]>({\n  name: 'News',\n  cacheTtlMs: 5 * 60_000, \u002F\u002F 5 minutes\n});\n\nexport async function fetchNews(category = 'general'): Promise\u003CNewsArticle[]> {\n  return newsBreaker.execute(async () => {\n    const resp = await fetch(`\u002Fapi\u002Fnews?category=${category}`);\n    if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n    const data = await resp.json();\n    return data.articles || [];\n  }, []);\n}\n\nexport async function searchNews(query: string): Promise\u003CNewsArticle[]> {\n  const resp = await fetch(`\u002Fapi\u002Fnews?q=${encodeURIComponent(query)}`);\n  if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n  const data = await resp.json();\n  return data.articles || [];\n}\n```\n\n## HackerNews (No API Key Needed)\n\nFor tech news, HackerNews API is free and unlimited:\n\n```typescript\n\u002F\u002F Fetch top 30 stories\nconst topIds = await fetch('https:\u002F\u002Fhacker-news.firebaseio.com\u002Fv0\u002Ftopstories.json').then(r => r.json());\nconst stories = await Promise.all(\n  topIds.slice(0, 30).map((id: number) =>\n    fetch(`https:\u002F\u002Fhacker-news.firebaseio.com\u002Fv0\u002Fitem\u002F${id}.json`).then(r => r.json())\n  )\n);\n\u002F\u002F Each story: { title, url, score, by, time, descendants }\n```\n\n## Panel Rendering Pattern\n\n```typescript\nprivate render(articles: NewsArticle[]): void {\n  const rows = articles.map(a => `\n    \u003Cdiv class=\"news-item\">\n      \u003Ca href=\"${a.url}\" target=\"_blank\" rel=\"noopener\" class=\"news-title\">${escapeHtml(a.title)}\u003C\u002Fa>\n      \u003Cdiv class=\"news-meta\">\n        \u003Cspan class=\"news-source\">${escapeHtml(a.source)}\u003C\u002Fspan>\n        \u003Cspan class=\"news-time\">${formatTime(new Date(a.publishedAt))}\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  `).join('');\n  this.setContent(`\u003Cdiv class=\"news-list\">${rows}\u003C\u002Fdiv>`);\n}\n```\n\nAlways escape user-controlled strings with `escapeHtml()` to prevent XSS.\n\n","# News API Integration\n\nMultiple news APIs available. GNews is recommended for free tier usability.\n\n## Recommended: GNews\n\n- **Docs**: https:\u002F\u002Fgnews.io\u002Fdocs\u002Fv4\n- **Base URL**: `https:\u002F\u002Fgnews.io\u002Fapi\u002Fv4`\n- **Auth**: Query param `token=API_KEY`\n- **Free tier**: 100 requests\u002Fday, 10 articles per request\n- **CORS**: Yes\n\n### Top Headlines\n\n```\nGET \u002Ftop-headlines?category=general&lang=en&max=10&token=API_KEY\n```\n\nCategories: `general`, `world`, `nation`, `business`, `technology`, `entertainment`, `sports`, `science`, `health`\n\n### Search\n\n```\nGET \u002Fsearch?q=artificial+intelligence&lang=en&max=10&token=API_KEY\n```\n\n### Response Shape\n\n```json\n{\n  \"totalArticles\": 1234,\n  \"articles\": [\n    {\n      \"title\": \"Article Title\",\n      \"description\": \"Short description...\",\n      \"content\": \"Full article content (truncated)...\",\n      \"url\": \"https:\u002F\u002Fexample.com\u002Farticle\",\n      \"image\": \"https:\u002F\u002Fexample.com\u002Fimage.jpg\",\n      \"publishedAt\": \"2024-01-15T12:00:00Z\",\n      \"source\": {\n        \"name\": \"CNN\",\n        \"url\": \"https:\u002F\u002Fcnn.com\"\n      }\n    }\n  ]\n}\n```\n\n## Alternative: NewsAPI.org\n\n- **Docs**: https:\u002F\u002Fnewsapi.org\u002Fdocs\n- **Free tier**: 100 requests\u002Fday, for development only\n- **Note**: Free plan does NOT support production use (requires paid plan for CORS from browser)\n\n```\nGET \u002Fv2\u002Ftop-headlines?country=us&apiKey=API_KEY\nGET \u002Fv2\u002Feverything?q=bitcoin&apiKey=API_KEY\n```\n\n## Other Alternatives (from public-apis)\n\n| API | Free Tier | Best For |\n|-----|-----------|----------|\n| **GNews** | 100 req\u002Fday | General news, good free tier |\n| **Currents API** | 600 req\u002Fday | Real-time news, good rate |\n| **NewsData.io** | 200 req\u002Fday | News + crypto news |\n| **The Guardian** | Unlimited (rate limited) | UK\u002Finternational news |\n| **New York Times** | 500 req\u002Fday | US news, archives |\n| **Mediastack** | 500 req\u002Fmonth | Multi-source aggregation |\n| **TheNews API** | 100 req\u002Fday | Simple aggregation |\n| **MarketAux** | 100 req\u002Fday | Financial news with sentiment |\n| **HackerNews** | No limit | Tech\u002Fstartup news (no key needed) |\n\n## Frontend Service Implementation\n\n```typescript\n\u002F\u002F src\u002Fservices\u002Fnews.ts\nimport { createCircuitBreaker } from '@\u002Futils\u002Fcircuit-breaker';\n\nexport interface NewsArticle {\n  title: string;\n  description: string;\n  url: string;\n  source: string;\n  publishedAt: string;\n  image?: string;\n}\n\nconst newsBreaker = createCircuitBreaker\u003CNewsArticle[]>({\n  name: 'News',\n  cacheTtlMs: 5 * 60_000, \u002F\u002F 5 minutes\n});\n\nexport async function fetchNews(category = 'general'): Promise\u003CNewsArticle[]> {\n  return newsBreaker.execute(async () => {\n    const resp = await fetch(`\u002Fapi\u002Fnews?category=${category}`);\n    if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n    const data = await resp.json();\n    return data.articles || [];\n  }, []);\n}\n\nexport async function searchNews(query: string): Promise\u003CNewsArticle[]> {\n  const resp = await fetch(`\u002Fapi\u002Fnews?q=${encodeURIComponent(query)}`);\n  if (!resp.ok) throw new Error(`HTTP ${resp.status}`);\n  const data = await resp.json();\n  return data.articles || [];\n}\n```\n\n## HackerNews (No API Key Needed)\n\nFor tech news, HackerNews API is free and unlimited:\n\n```typescript\n\u002F\u002F Fetch top 30 stories\nconst topIds = await fetch('https:\u002F\u002Fhacker-news.firebaseio.com\u002Fv0\u002Ftopstories.json').then(r => r.json());\nconst stories = await Promise.all(\n  topIds.slice(0, 30).map((id: number) =>\n    fetch(`https:\u002F\u002Fhacker-news.firebaseio.com\u002Fv0\u002Fitem\u002F${id}.json`).then(r => r.json())\n  )\n);\n\u002F\u002F Each story: { title, url, score, by, time, descendants }\n```\n\n## Panel Rendering Pattern\n\n```typescript\nprivate render(articles: NewsArticle[]): void {\n  const rows = articles.map(a => `\n    \u003Cdiv class=\"news-item\">\n      \u003Ca href=\"${a.url}\" target=\"_blank\" rel=\"noopener\" class=\"news-title\">${escapeHtml(a.title)}\u003C\u002Fa>\n      \u003Cdiv class=\"news-meta\">\n        \u003Cspan class=\"news-source\">${escapeHtml(a.source)}\u003C\u002Fspan>\n        \u003Cspan class=\"news-time\">${formatTime(new Date(a.publishedAt))}\u003C\u002Fspan>\n      \u003C\u002Fdiv>\n    \u003C\u002Fdiv>\n  `).join('');\n  this.setContent(`\u003Cdiv class=\"news-list\">${rows}\u003C\u002Fdiv>`);\n}\n```\n\nAlways escape user-controlled strings with `escapeHtml()` to prevent XSS.\n\n",{"name":5,"description":7},"main","6b84b0689ca0d9e7b1e4061188ff6b60758e0f8a","openspace\u002Fexamples\u002Fmy-daily-monitor\u002Fskills\u002Fnews-api-integration",938,"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot","https:\u002F\u002Fgithub.com\u002FHKUDS","https:\u002F\u002Fsites.google.com\u002Fview\u002Fchaoh","2026-11-06 23:04:01",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add HKUDS\u002FAgentPilot --skill news-api-integration",{"tool":60,"command":61},"bunx","bunx skills add HKUDS\u002FAgentPilot --skill news-api-integration",{"tool":63,"command":64},"pnpm","pnpm dlx skills add HKUDS\u002FAgentPilot --skill news-api-integration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fexamples\u002Fmy-daily-monitor\u002Fskills\u002Fnews-api-integration\u002FSKILL.md",true,[68],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},".skill_id","OTHER","其他",35,"https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fexamples\u002Fmy-daily-monitor\u002Fskills\u002Fnews-api-integration\u002F.skill_id",[75,94,113,135,158,181],{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":41},"01M6HYB297NDABRERJRVG0K8R0","agentpilot","Set up AgentPilot and use its single entry to prepare missing inputs and run configured RSI experiments. Use when the user requests AgentPilot installation or work with AgentPilot.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fplugins\u002Fagentpilot\u002Fskills\u002Fagentpilot\u002FSKILL.md",[],[77,82,83,38,84,85,86,87,88,89,90,91,92,93],"prepare","requests","missing","installation","rsi","up","use","user","work","SET","run","experiments",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":41},"01M6HYAYWXTTE1J7DJM0MFNQ4H","remember","Review auto-memory entries and propose promotions to OPENSPACE.md, OPENSPACE.local.md, or retained auto-memory topics; detect duplicates, stale facts, conflicts, and ambiguous entries before making changes.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fskills\u002Fremember\u002FSKILL.md",[],[96,101,102,103,104,105,106,107,108,109,110,111,112],"memory","review","auto","openspace","changes","facts","detect","entries","local","conflicts","stale","duplicates",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":122,"publishedAt":41},"01M6HYAVMPM4SBDV60R2B5HPV8","skill-discovery","Search reusable OpenSpace skills locally, and browse cloud packages step by step when a cloud skill may help. Reusing proven skills saves tokens, improves reliability, and extends your capabilities beyond built-in tools.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fhost_skills\u002Fskill-discovery\u002FSKILL.md",[119],{"categoryNo":120,"categoryName":121,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[123,124,125,104,126,127,128,129,130,131,132,133,34,134],"skill discovery","discovery","reusable","step by step","tokens","packages","help","cloud","reliability","capabilities","browse","Tools",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":142,"publishedAt":41},"01M6HYAR811B3RB0M50RBEDGN6","delegate-task","Delegate tasks to OpenSpace — a full-stack autonomous worker for coding, DevOps, web research, and desktop automation, backed by an extensive MCP tool and skill library. Skills auto-improve through use, reducing token consumption over time. A cloud community lets agents share and collectively evolve reusable skills.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Fopenspace\u002Fhost_skills\u002Fdelegate-task\u002FSKILL.md",[141],{"categoryNo":120,"categoryName":121,"taxonomyType":21,"taxonomyTypeDesc":22},[143,144,145,104,146,147,148,149,150,125,103,88,151,152,153,40,154,155,156,157],"delegate","task","delegate task","time","improve","desktop automation","worker","community","autonomous","tool","stack","share","tasks","automation","MCP",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":41},"01M6HYAM9FSGV6E52AYENDQXYH","write-special-chars-ts-check","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, plus a reliable TypeScript type-checking step that filters output to only the newly-written files to avoid being misled by pre-existing errors.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-ts-check\u002FSKILL.md",[],[165,166,167,168,169,170,171,172,173,174,175,176,177,178,40,179,180],"write special chars ts check","write","check","type","files","filters","only","template","file","python","typescript","output","Existing","type-checking","errors","script",{"skillNo":182,"name":183,"nameZh":6,"description":184,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":185,"categories":186,"keywords":187,"publishedAt":41},"01M6HYAH05HGV7SVWSVR8PJRQD","write-special-chars-readback","Workaround for write_file failures caused by special characters (apostrophes, backticks, template literals) using a Python heredoc script, with mandatory post-write verification via read_file and cleanup of \u002Ftmp helper scripts.","https:\u002F\u002Fgithub.com\u002FHKUDS\u002FAgentPilot\u002Fblob\u002Fmain\u002Fopenspace\u002Flegacy\u002Fv1\u002Fshowcase\u002Fskills\u002Fwrite-special-chars-readback\u002FSKILL.md",[],[188,189,166,38,40,180,190,191,192,193,194,172,173,195,196,174],"write special chars readback","readback","helper","post","via","scripts","read","verification","cleanup"]