GitHub

search-repos

github.com
InstallationInstalls just this skill for your agent
Side effectread
Authnone
Needsnavigate · evaluate
Summary

Search GitHub repositories by keyword, sorted by stars, forks or recency.

Params
{"query":"string (GitHub search query, e.g. 'browser automation language:python')","sort":"string optional: stars | forks | updated ('' for best match)","per_page":"int optional (default 20, max 50)"}
Returns
{"count":"int","total":"int (total matches)","query":"string","results":"array of { full_name, description, stars, forks, language, url, updated, topics }"}
SKILL.md29 lines

Intent

Search GitHub repositories by keyword via the public REST API (api.github.com), which allows cross-origin browser requests. Params: query (a GitHub search query, e.g. 'browser automation language:python'), sort (stars | forks | updated, '' for best match), per_page (default 20, max 50). Returns {count, total, results:[{full_name, description, stars, forks, language, url, updated, topics}]}. Unauthenticated search is rate-limited to about 10 requests per minute.

Execute

  1. navigate → https://github.com
  2. evaluate the Extractor below with params. It does the in-page work and returns the JSON in returns.

Extractor

( async (root, params) => { const q = String((params && params.query) || '').trim(); if (!q) throw new Error('missing query'); const sort = String((params && params.sort) || '').trim(); let per = parseInt(String((params && params.per_page) || '20'), 10) || 20; if (per > 50) per = 50; const H = { 'accept': 'application/vnd.github+json', 'x-github-api-version': '2022-11-28' }; const url = 'https://api.github.com/search/repositories?q=' + encodeURIComponent(q) + (sort ? ('&sort=' + sort + '&order=desc') : '') + '&per_page=' + per; const r = await fetch(url, { headers: H }); if (r.status === 403) return { error: 'rate limited (unauthenticated search is capped). Try again in a minute.', count: 0, total: 0, results: [] }; const d = await r.json(); const results = (d.items || []).map(x => ({ full_name: x.full_name, description: x.description || null, stars: x.stargazers_count, forks: x.forks_count, language: x.language || null, url: x.html_url, updated: x.pushed_at, topics: x.topics || [] })); return { count: results.length, total: d.total_count || 0, query: q, results }; } )

Success assertion

{
  "expr": "typeof result === 'object' && Array.isArray(result.results)",
  "type": "value"
}