random-contributor

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Random Contributor Skill

随机贡献者Skill

Purpose
  • Select a uniformly random contributor from a public GitHub repository. Useful for sampling, shoutouts, delegation, or fair assignment among contributors.
What it does
  • Uses GitHub REST API (public endpoints) to list contributors for a repo (handles pagination).
  • Falls back to scraping the repository's contributors page if API rate limits or CORS prevent API use.
  • Returns contributor info: login, name (if available), avatar URL, profile URL, contributions count.
When to use
  • Pick a random maintainer or contributor for tasks like "who should review" or "who to credit".
  • Should be used only on public repositories.
Prerequisites
  • curl
    and
    jq
    for Bash examples, or Node.js 18+ for JS examples.
  • Optional GitHub token (GH_TOKEN) increases rate limits; skill works without it for small repos.

Examples

Bash (uses GitHub API; paginates with per_page=100):
bash
REPO_OWNER=besoeasy
REPO_NAME=open-skills
用途
  • 从公开GitHub仓库中均匀随机挑选一位贡献者。适用于抽样、公开致谢、任务委派或在贡献者之间公平分配任务等场景。
功能说明
  • 使用GitHub REST API(公开端点)列出仓库的贡献者(支持分页处理)。
  • 若遇到API速率限制或CORS问题导致无法使用API,则回退到抓取仓库的贡献者页面。
  • 返回贡献者信息:登录名、姓名(若有)、头像URL、个人主页URL、贡献次数。
适用场景
  • 随机挑选一位维护者或贡献者来完成诸如“谁来审核”或“谁应获得致谢”之类的任务。
  • 仅适用于公开仓库。
前置条件
  • Bash示例需要
    curl
    jq
    ,JS示例需要Node.js 18+。
  • 可选的GitHub令牌(GH_TOKEN)可提高速率限制;对于小型仓库,无需令牌也可使用该Skill。

示例

Bash(使用GitHub API;通过per_page=100实现分页):
bash
REPO_OWNER=besoeasy
REPO_NAME=open-skills

Fetch contributor list (public API). Uses optional GH_TOKEN env for higher rate limit.

Fetch contributor list (public API). Uses optional GH_TOKEN env for higher rate limit.

AUTH_HEADER="" if [ -n "${GH_TOKEN:-}" ]; then AUTH_HEADER="-H "Authorization: token ${GH_TOKEN}"" fi
AUTH_HEADER="" if [ -n "${GH_TOKEN:-}" ]; then AUTH_HEADER="-H "Authorization: token ${GH_TOKEN}"" fi

Get contributors (first page); for large repos you'd page. Here we do simple pagination loop.

Get contributors (first page); for large repos you'd page. Here we do simple pagination loop.

contributors=() page=1 while true; do out=$(eval "curl -fsS ${AUTH_HEADER} "https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/contributors?per_page=100&page=${page}\"") count=$(echo "$out" | jq 'length') if [ "$count" -eq 0 ]; then break; fi logins=$(echo "$out" | jq -r '.[].login') while read -r l; do contributors+=("$l"); done <<< "$logins" if [ "$count" -lt 100 ]; then break; fi page=$((page+1)) done
contributors=() page=1 while true; do out=$(eval "curl -fsS ${AUTH_HEADER} "https://api.github.com/repos/${REPO_OWNER}/${REPO_NAME}/contributors?per_page=100&page=${page}\"") count=$(echo "$out" | jq 'length') if [ "$count" -eq 0 ]; then break; fi logins=$(echo "$out" | jq -r '.[].login') while read -r l; do contributors+=("$l"); done <<< "$logins" if [ "$count" -lt 100 ]; then break; fi page=$((page+1)) done

Pick random

Pick random

idx=$((RANDOM % ${#contributors[@]})) selected=${contributors[$idx]} echo "$selected"

Node.js (recommended: uses native fetch and handles pagination):

```javascript
async function getRandomContributor(owner, repo, token) {
  const headers = {};
  if (token) headers['Authorization'] = `token ${token}`;

  let page = 1;
  const per = 100;
  const all = [];

  while (true) {
    const url = `https://api.github.com/repos/${owner}/${repo}/contributors?per_page=${per}&page=${page}`;
    const res = await fetch(url, { headers });
    if (!res.ok) break;
    const data = await res.json();
    if (!Array.isArray(data) || data.length === 0) break;
    all.push(...data);
    if (data.length < per) break;
    page++;
  }

  if (!all.length) return null;
  const pick = all[Math.floor(Math.random() * all.length)];
  return {
    login: pick.login,
    avatar: pick.avatar_url,
    profile: pick.html_url,
    contributions: pick.contributions
  };
}

// Usage:
// getRandomContributor('besoeasy','open-skills', process.env.GH_TOKEN).then(console.log)

Agent prompt

"Find a random contributor for {owner}/{repo}. Use the GitHub API; if API rate limits block you, fall back to scraping the contributors page. Return JSON: {login, name?, avatar, profile, contributions}."
Notes & Caveats
  • For very large repos (>1000 contributors) consider streaming or reservoir sampling instead of fetching all contributors at once.
  • Respect GitHub API rate limits; provide an option to use GH_TOKEN to increase limits.
  • Public repos only; do not attempt to access private repos without appropriate credentials.
See also
  • skills/check-crypto-address-balance (example of API usage patterns)
idx=$((RANDOM % ${#contributors[@]})) selected=${contributors[$idx]} echo "$selected"

Node.js(推荐:使用原生fetch并支持分页):

```javascript
async function getRandomContributor(owner, repo, token) {
  const headers = {};
  if (token) headers['Authorization'] = `token ${token}`;

  let page = 1;
  const per = 100;
  const all = [];

  while (true) {
    const url = `https://api.github.com/repos/${owner}/${repo}/contributors?per_page=${per}&page=${page}`;
    const res = await fetch(url, { headers });
    if (!res.ok) break;
    const data = await res.json();
    if (!Array.isArray(data) || data.length === 0) break;
    all.push(...data);
    if (data.length < per) break;
    page++;
  }

  if (!all.length) return null;
  const pick = all[Math.floor(Math.random() * all.length)];
  return {
    login: pick.login,
    avatar: pick.avatar_url,
    profile: pick.html_url,
    contributions: pick.contributions
  };
}

// Usage:
// getRandomContributor('besoeasy','open-skills', process.env.GH_TOKEN).then(console.log)

Agent提示词

"为{owner}/{repo}查找一位随机贡献者。使用GitHub API;若API速率限制阻止访问,则回退到抓取贡献者页面。返回JSON格式:{login, name?, avatar, profile, contributions}。"
注意事项
  • 对于超大型仓库(贡献者超过1000人),建议使用流处理或蓄水池抽样,而非一次性获取所有贡献者。
  • 遵守GitHub API的速率限制;提供使用GH_TOKEN来提高限制的选项。
  • 仅适用于公开仓库;若无适当凭据,请勿尝试访问私有仓库。
另请参阅
  • skills/check-crypto-address-balance(API使用模式示例)