Skill: linshengli/github-search (version 1.0.0)

--- name: github-research description: GitHub 仓库深度搜索与分析。支持按关键词、语言、stars、更新时间筛选，获取细分领域最新开源项目。专为技术调研设计。 metadata: openclaw: emoji: "🐙" category: "research" tags: ["github", "opensource", "research", "repository"] --- # GitHub Research 🐙 GitHub 仓库深度搜索与分析工具。专为技术细分领域调研设计，支持多维度筛选和详细数据分析。 ## 功能特性 - 🔍 **精准搜索** - 按关键词搜索特定领域的 GitHub 仓库 - 📊 **多维度筛选** - Stars、语言、更新时间、Forks - 📈 **趋势分析** - 识别活跃项目和新兴趋势 - 🏷️ **标签分类** - 自动提取项目标签和主题 - 📋 **结构化输出** - Markdown表格，易于整合到报告 ## 使用方式 ### 基础搜索 ```bash # 搜索特定领域 node scripts/github-search.mjs "agent memory" # 指定编程语言 node scripts/github-search.mjs "rag" --language python # 更多结果 node scripts/github-search.mjs "llm" --limit 20 ``` ### 高级筛选 ```bash # 筛选高星项目（>1000 stars） node scripts/github-search.mjs "vector database" --min-stars 1000 # 最近更新的项目（30天内） node scripts/github-search.mjs "embedding" --updated-within 30 # 组合筛选 node scripts/github-search.mjs "multi-agent" \ --language python \ --min-stars 500 \ --updated-within 90 \ --limit 15 ``` ### 获取详细信息 ```bash # 获取单个仓库的详细信息 node scripts/repo-detail.mjs "microsoft/autogen" # 批量获取（从搜索结果） cat search-results.json | node scripts/batch-detail.mjs ``` ## 输出格式 ### 搜索结果表格 ```markdown ## 🔥 GitHub 热门项目: agent memory | 排名 | 项目 | ⭐ Stars | 🍴 Forks | 💻 语言 | 📅 更新 | 🔗 链接 | |-----|------|---------|---------|--------|--------|--------| | 1 | microsoft/autogen | 32.5k | 4.8k | Python | 2天前 | [查看](https://github.com/microsoft/autogen) | | 2 | langchain-ai/langchain | 89.2k | 14.1k | Python | 1天前 | [查看](https://github.com/langchain-ai/langchain) | | 3 | ... | ... | ... | ... | ... | ... | ### 📊 统计摘要 - **总项目数**: 15 - **平均 Stars**: 5,230 - **主要语言**: Python (80%), TypeScript (13%), Go (7%) - **活跃度**: 73% 最近30天有更新 ``` ### 详细报告 ```markdown ## 📋 项目详情: microsoft/autogen **全称**: AutoGen **描述**: A programming framework for building AI agents **🏷️ 标签**: ai-agents, multi-agent, llm, python **📈 数据统计** - Stars: 32,547 (+156 this week) - Forks: 4,823 - Issues: 1,234 open - Pull Requests: 89 open **💻 代码信息** - 主要语言: Python (98.2%) - 代码行数: ~150k - 许可证: MIT **📅 活跃度** - 最后提交: 2天前 - 提交频率: 日均 12 commits - 贡献者: 234人 **🔗 链接** - 仓库: https://github.com/microsoft/autogen - 文档: https://microsoft.github.io/autogen/ - 示例: https://github.com/microsoft/autogen/tree/main/samples ``` ## 参数说明 | 参数 | 说明 | 默认值 | 示例 | |------|------|--------|------| | `query` | 搜索关键词 | 必填 | `"agent memory"` | | `--language` | 编程语言筛选 | 无 | `python`, `typescript`, `go` | | `--min-stars` | 最小 stars 数 | 100 | `1000` | | `--max-stars` | 最大 stars 数 | 无限制 | `50000` | | `--updated-within` | 最近N天更新 | 365 | `30`, `90` | | `--created-after` | 创建日期之后 | 无 | `2024-01-01` | | `--sort` | 排序方式 | stars | `stars`, `updated`, `forks` | | `--order` | 排序顺序 | desc | `asc`, `desc` | | `--limit` | 返回结果数 | 10 | `20`, `50` | | `--output` | 输出格式 | table | `table`, `json`, `csv` | ## 工作流集成 ### 在 Multi-Agent Research 中使用 ```python # Intel Agent 调用 GitHub Research subagent_task = """ 你是情报分析师。使用 github-research skill 获取最新数据。 执行以下命令： ```bash node ~/.openclaw/workspace/skills/github-research/scripts/github-search.mjs \ "agent memory" \ --language python \ --min-stars 500 \ --updated-within 90 \ --limit 15 \ --output json > /tmp/gh_results.json ``` 基于结果生成报告表格... """ ``` ### 批量分析多个领域 ```bash #!/bin/bash TOPICS=("agent memory" "rag" "vector database" "llm orchestration") for topic in "${TOPICS[@]}"; do safe_topic=$(echo "$topic" | tr ' ' '-') node scripts/github-search.mjs "$topic" \ --min-stars 1000 \ --limit 15 \ --output json > "results/${safe_topic}.json" done ``` ## API 限制 - **未认证请求**: 60次/小时 - **认证请求**: 5000次/小时 - **建议**: 对于大量查询，配置 GitHub Token ### 配置 GitHub Token（可选） ```bash export GITHUB_TOKEN="ghp_your_token_here" ``` ## 数据来源 - GitHub Search API v3 - GitHub REST API - 官方 GitHub 网站（备用） --- *专为技术细分领域调研设计 | GitHub Research v1.0*

path: README.md
content: # GitHub Research 🐙

GitHub 仓库深度搜索与分析工具。专为技术细分领域调研设计。

## 快速开始

```bash
# 基础搜索
node scripts/github-search.mjs "agent memory"

# Python项目，最少1000 stars
node scripts/github-search.mjs "rag" --language python --min-stars 1000

# 最近30天更新的项目
node scripts/github-search.mjs "vector database" --updated-within 30 --limit 15

# 获取详细信息
node scripts/repo-detail.mjs "microsoft/autogen"
```

## 功能特性

- 🔍 **精准搜索** - 按关键词搜索特定领域的 GitHub 仓库
- 📊 **多维度筛选** - Stars、语言、更新时间、Forks
- 📈 **趋势分析** - 识别活跃项目和新兴趋势
- 🏷️ **标签分类** - 自动提取项目标签和主题
- 📋 **结构化输出** - Markdown表格，易于整合到报告

## 参数说明

| 参数 | 说明 | 默认值 |
|------|------|--------|
| `query` | 搜索关键词 | 必填 |
| `--language` | 编程语言筛选 | 无 |
| `--min-stars` | 最小 stars 数 | 100 |
| `--max-stars` | 最大 stars 数 | 无限制 |
| `--updated-within` | 最近N天更新 | 365 |
| `--created-after` | 创建日期之后 | 无 |
| `--sort` | 排序方式 | stars |
| `--order` | 排序顺序 | desc |
| `--limit` | 返回结果数 | 10 |
| `--output` | 输出格式 | table |

## 使用

```javascript
// Intel Agent 调用示例
const task = `
执行 GitHub 搜索：
\`\`\`bash
node ~/.openclaw/workspace/skills/github-research/scripts/github-search.mjs \\
  "${topic}" \\
  --language python \\
  --min-stars 500 \\
  --updated-within 90 \\
  --limit 15
\`\`\`

基于搜索结果生成报告...
`;
```

## 输出示例

```markdown
## 🔥 GitHub 热门项目: agent memory

| 排名 | 项目 | ⭐ Stars | 🍴 Forks | 💻 语言 | 📅 更新 | 🔗 链接 |
|-----|------|---------|---------|--------|--------|--------|
| 1 | microsoft/autogen | 32.5k | 4.8k | Python | 2天前 | [查看](https://github.com/microsoft/autogen) |
| 2 | langchain-ai/langchain | 89.2k | 14.1k | Python | 1天前 | [查看](https://github.com/langchain-ai/langchain) |

### 📊 统计摘要
- **总项目数**: 15
- **平均 Stars**: 5,230
- **主要语言**: Python (80%), TypeScript (13%)
- **活跃度**: 73% 最近30天有更新
```

## API 限制

- **未认证**: 60次/小时
- **认证**: 5000次/小时（配置 GITHUB_TOKEN）

```bash
export GITHUB_TOKEN="ghp_your_token_here"
```

---

*专为技术细分领域调研设计*


path: scripts/github-search.mjs
content: #!/usr/bin/env node
/**
 * GitHub Repository Search Tool
 * 搜索 GitHub 仓库，支持多维度筛选
 */

import { execSync } from 'child_process';
import fs from 'fs';
import path from 'path';

const GITHUB_API = 'https://api.github.com/search/repositories';

// 解析命令行参数
function parseArgs() {
  const args = process.argv.slice(2);
  const options = {
    query: '',
    language: null,
    minStars: 100,
    maxStars: null,
    updatedWithin: 365,
    createdAfter: null,
    sort: 'stars',
    order: 'desc',
    limit: 10,
    output: 'table'
  };

  for (let i = 0; i < args.length; i++) {
    const arg = args[i];
    
    if (!arg.startsWith('--')) {
      options.query = arg;
    } else if (arg === '--language' || arg === '-l') {
      options.language = args[++i];
    } else if (arg === '--min-stars') {
      options.minStars = parseInt(args[++i]);
    } else if (arg === '--max-stars') {
      options.maxStars = parseInt(args[++i]);
    } else if (arg === '--updated-within') {
      options.updatedWithin = parseInt(args[++i]);
    } else if (arg === '--created-after') {
      options.createdAfter = args[++i];
    } else if (arg === '--sort') {
      options.sort = args[++i];
    } else if (arg === '--order') {
      options.order = args[++i];
    } else if (arg === '--limit' || arg === '-n') {
      options.limit = parseInt(args[++i]);
    } else if (arg === '--output' || arg === '-o') {
      options.output = args[++i];
    }
  }

  return options;
}

// 构建 GitHub 搜索查询
function buildQuery(options) {
  let query = options.query;
  
  if (options.language) {
    query += ` language:${options.language}`;
  }
  
  if (options.minStars) {
    query += ` stars:>=${options.minStars}`;
  }
  
  if (options.maxStars) {
    query += ` stars:<=${options.maxStars}`;
  }
  
  if (options.updatedWithin) {
    const date = new Date();
    date.setDate(date.getDate() - options.updatedWithin);
    const dateStr = date.toISOString().split('T')[0];
    query += ` pushed:>=${dateStr}`;
  }
  
  if (options.createdAfter) {
    query += ` created:>=${options.createdAfter}`;
  }
  
  return query;
}

// 调用 GitHub API
async function searchGitHub(query, sort, order, perPage = 30) {
  const url = `${GITHUB_API}?q=${encodeURIComponent(query)}&sort=${sort}&order=${order}&per_page=${perPage}`;
  
  const headers = [
    '-H "Accept: application/vnd.github.v3+json"',
    '-H "User-Agent: GitHub-Research-Skill"'
  ];
  
  // 如果有 token，添加认证
  if (process.env.GITHUB_TOKEN) {
    headers.push(`-H "Authorization: token ${process.env.GITHUB_TOKEN}"`);
  }
  
  const cmd = `curl -s ${headers.join(' ')} "${url}"`;
  
  try {
    const result = execSync(cmd, { encoding: 'utf-8', timeout: 30000 });
    return JSON.parse(result);
  } catch (error) {
    console.error('Error calling GitHub API:', error.message);
    return null;
  }
}

// 格式化日期
function formatDate(dateStr) {
  if (!dateStr) return 'N/A';
  const date = new Date(dateStr);
  const now = new Date();
  const diffDays = Math.floor((now - date) / (1000 * 60 * 60 * 24));
  
  if (diffDays === 0) return '今天';
  if (diffDays === 1) return '昨天';
  if (diffDays < 7) return `${diffDays}天前`;
  if (diffDays < 30) return `${Math.floor(diffDays / 7)}周前`;
  if (diffDays < 365) return `${Math.floor(diffDays / 30)}月前`;
  return `${Math.floor(diffDays / 365)}年前`;
}

// 格式化数字
function formatNumber(num) {
  if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M';
  if (num >= 1000) return (num / 1000).toFixed(1) + 'k';
  return num.toString();
}

// 生成 Markdown 表格
function generateTable(repos, query) {
  let output = `## 🔥 GitHub 热门项目: ${query}\n\n`;
  output += '| 排名 | 项目 | ⭐ Stars | 🍴 Forks | 💻 语言 | 📅 更新 | 🔗 链接 |\n';
  output += '|-----|------|---------|---------|--------|--------|--------|\n';
  
  repos.forEach((repo, index) => {
    const name = repo.full_name;
    const stars = formatNumber(repo.stargazers_count);
    const forks = formatNumber(repo.forks_count);
    const lang = repo.language || 'N/A';
    const updated = formatDate(repo.pushed_at);
    const url = repo.html_url;
    
    output += `| ${index + 1} | ${name} | ${stars} | ${forks} | ${lang} | ${updated} | [查看](${url}) |\n`;
  });
  
  // 统计摘要
  const totalStars = repos.reduce((sum, r) => sum + r.stargazers_count, 0);
  const avgStars = Math.round(totalStars / repos.length);
  const languages = {};
  repos.forEach(r => {
    const lang = r.language || 'Unknown';
    languages[lang] = (languages[lang] || 0) + 1;
  });
  const mainLang = Object.entries(languages)
    .sort((a, b) => b[1] - a[1])
    .map(([lang, count]) => `${lang} (${Math.round(count/repos.length*100)}%)`)
    .slice(0, 3)
    .join(', ');
  
  const recentlyUpdated = repos.filter(r => {
    const days = Math.floor((new Date() - new Date(r.pushed_at)) / (1000 * 60 * 60 * 24));
    return days <= 30;
  }).length;
  
  output += '\n### 📊 统计摘要\n';
  output += `- **总项目数**: ${repos.length}\n`;
  output += `- **平均 Stars**: ${formatNumber(avgStars)}\n`;
  output += `- **主要语言**: ${mainLang}\n`;
  output += `- **活跃度**: ${Math.round(recentlyUpdated/repos.length*100)}% 最近30天有更新\n`;
  
  return output;
}

// 生成 JSON 输出
function generateJSON(repos, query) {
  return JSON.stringify({
    query,
    timestamp: new Date().toISOString(),
    total_count: repos.length,
    repositories: repos.map(repo => ({
      rank: 0,
      full_name: repo.full_name,
      description: repo.description,
      html_url: repo.html_url,
      stargazers_count: repo.stargazers_count,
      forks_count: repo.forks_count,
      language: repo.language,
      pushed_at: repo.pushed_at,
      created_at: repo.created_at,
      topics: repo.topics || [],
      license: repo.license?.name || 'N/A'
    }))
  }, null, 2);
}

// 生成 CSV 输出
function generateCSV(repos) {
  const headers = ['rank', 'full_name', 'description', 'stars', 'forks', 'language', 'updated_at', 'url'];
  let csv = headers.join(',') + '\n';
  
  repos.forEach((repo, index) => {
    const row = [
      index + 1,
      `"${repo.full_name}"`,
      `"${(repo.description || '').replace(/"/g, '""')}"`,
      repo.stargazers_count,
      repo.forks_count,
      repo.language || 'N/A',
      repo.pushed_at,
      repo.html_url
    ];
    csv += row.join(',') + '\n';
  });
  
  return csv;
}

// 主函数
async function main() {
  const options = parseArgs();
  
  if (!options.query) {
    console.log('用法: node github-search.mjs <关键词> [选项]');
    console.log('');
    console.log('选项:');
    console.log('  --language, -l     编程语言 (如: python, javascript)');
    console.log('  --min-stars        最小 stars 数 (默认: 100)');
    console.log('  --max-stars        最大 stars 数');
    console.log('  --updated-within   最近N天更新 (默认: 365)');
    console.log('  --created-after    创建日期之后 (如: 2024-01-01)');
    console.log('  --sort             排序方式: stars, updated, forks (默认: stars)');
    console.log('  --order            排序顺序: asc, desc (默认: desc)');
    console.log('  --limit, -n        返回结果数 (默认: 10)');
    console.log('  --output, -o       输出格式: table, json, csv (默认: table)');
    console.log('');
    console.log('示例:');
    console.log('  node github-search.mjs "agent memory"');
    console.log('  node github-search.mjs "rag" --language python --min-stars 1000');
    console.log('  node github-search.mjs "vector database" --limit 20 --output json');
    process.exit(1);
  }
  
  console.error(`🔍 搜索: "${options.query}"`);
  console.error(`📊 筛选: ${options.language ? '语言=' + options.language + ', ' : ''}stars>=${options.minStars}, 最近${options.updatedWithin}天更新`);
  console.error('⏳ 请求 GitHub API...\n');
  
  const query = buildQuery(options);
  console.error(`📝 查询语句: ${query}\n`);
  
  const data = await searchGitHub(query, options.sort, options.order, Math.min(options.limit, 100));
  
  if (!data || !data.items) {
    console.error('❌ 搜索失败或没有结果');
    process.exit(1);
  }
  
  const repos = data.items.slice(0, options.limit);
  
  console.error(`✅ 找到 ${data.total_count} 个项目，显示前 ${repos.length} 个\n`);
  
  // 根据输出格式生成结果
  let output;
  switch (options.output) {
    case 'json':
      output = generateJSON(repos, options.query);
      break;
    case 'csv':
      output = generateCSV(repos);
      break;
    case 'table':
    default:
      output = generateTable(repos, options.query);
      break;
  }
  
  console.log(output);
}

main().catch(err => {
  console.error('错误:', err);
  process.exit(1);
});


path: scripts/repo-detail.mjs
content: #!/usr/bin/env node
/**
 * GitHub Repository Detail Fetcher
 * 获取单个仓库的详细信息
 */

import { execSync } from 'child_process';

const GITHUB_API = 'https://api.github.com/repos';

// 解析参数
function parseArgs() {
  const args = process.argv.slice(2);
  if (args.length < 1) {
    return null;
  }
  return args[0]; // repo full name, e.g., "microsoft/autogen"
}

// 调用 GitHub API
async function fetchRepoDetails(repoFullName) {
  const url = `${GITHUB_API}/${repoFullName}`;
  
  const headers = [
    '-H "Accept: application/vnd.github.v3+json"',
    '-H "User-Agent: GitHub-Research-Skill"'
  ];
  
  if (process.env.GITHUB_TOKEN) {
    headers.push(`-H "Authorization: token ${process.env.GITHUB_TOKEN}"`);
  }
  
  const cmd = `curl -s ${headers.join(' ')} "${url}"`;
  
  try {
    const result = execSync(cmd, { encoding: 'utf-8', timeout: 30000 });
    return JSON.parse(result);
  } catch (error) {
    console.error('Error fetching repo details:', error.message);
    return null;
  }
}

// 获取贡献者统计
async function fetchContributors(repoFullName) {
  const url = `${GITHUB_API}/${repoFullName}/contributors?per_page=10`;
  
  const headers = [
    '-H "Accept: application/vnd.github.v3+json"',
    '-H "User-Agent: GitHub-Research-Skill"'
  ];
  
  if (process.env.GITHUB_TOKEN) {
    headers.push(`-H "Authorization: token ${process.env.GITHUB_TOKEN}"`);
  }
  
  const cmd = `curl -s ${headers.join(' ')} "${url}"`;
  
  try {
    const result = execSync(cmd, { encoding: 'utf-8', timeout: 30000 });
    return JSON.parse(result);
  } catch (error) {
    return [];
  }
}

// 格式化日期
function formatDate(dateStr) {
  if (!dateStr) return 'N/A';
  const date = new Date(dateStr);
  return date.toLocaleDateString('zh-CN');
}

// 格式化数字
function formatNumber(num) {
  if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M';
  if (num >= 1000) return (num / 1000).toFixed(1) + 'k';
  return num.toString();
}

// 计算活跃度
function getActivityLevel(pushedAt) {
  const days = Math.floor((new Date() - new Date(pushedAt)) / (1000 * 60 * 60 * 24));
  if (days <= 7) return '🟢 非常活跃';
  if (days <= 30) return '🟡 活跃';
  if (days <= 90) return '🟠 一般';
  return '🔴 不活跃';
}

// 生成 Markdown 报告
function generateReport(repo, contributors) {
  let output = `## 📋 项目详情: ${repo.full_name}\n\n`;
  
  // 基本信息
  output += `**名称**: ${repo.name}\n`;
  output += `**描述**: ${repo.description || '无描述'}\n`;
  output += `**🏷️ 标签**: ${repo.topics?.join(', ') || '无标签'}\n\n`;
  
  // 数据统计
  output += `### 📈 数据统计\n`;
  output += `- ⭐ **Stars**: ${formatNumber(repo.stargazers_count)}\n`;
  output += `- 🍴 **Forks**: ${formatNumber(repo.forks_count)}\n`;
  output += `- 👁️ **Watchers**: ${formatNumber(repo.watchers_count)}\n`;
  output += `- 🐛 **Open Issues**: ${repo.open_issues_count}\n`;
  output += `- 🔀 **Open PRs**: ${repo.pull_requests_count || 'N/A'}\n\n`;
  
  // 代码信息
  output += `### 💻 代码信息\n`;
  output += `- **主要语言**: ${repo.language || 'N/A'}\n`;
  output += `- **许可证**: ${repo.license?.name || 'N/A'}\n`;
  output += `- **默认分支**: ${repo.default_branch}\n`;
  output += `- **仓库大小**: ${Math.round(repo.size / 1024)} MB\n\n`;
  
  // 活跃度
  output += `### 📅 活跃度\n`;
  output += `- **最后提交**: ${formatDate(repo.pushed_at)} (${getActivityLevel(repo.pushed_at)})\n`;
  output += `- **创建时间**: ${formatDate(repo.created_at)}\n`;
  output += `- **更新时间**: ${formatDate(repo.updated_at)}\n`;
  
  if (contributors && contributors.length > 0) {
    output += `- **主要贡献者**: ${contributors.slice(0, 5).map(c => c.login).join(', ')}\n`;
  }
  output += '\n';
  
  // 链接
  output += `### 🔗 链接\n`;
  output += `- **仓库**: ${repo.html_url}\n`;
  if (repo.homepage) {
    output += `- **主页**: ${repo.homepage}\n`;
  }
  output += `- **Issues**: ${repo.html_url}/issues\n`;
  output += `- **Pull Requests**: ${repo.html_url}/pulls\n`;
  
  return output;
}

// 主函数
async function main() {
  const repoFullName = parseArgs();
  
  if (!repoFullName) {
    console.log('用法: node repo-detail.mjs <owner/repo>');
    console.log('');
    console.log('示例:');
    console.log('  node repo-detail.mjs microsoft/autogen');
    console.log('  node repo-detail.mjs langchain-ai/langchain');
    process.exit(1);
  }
  
  console.error(`🔍 获取仓库详情: ${repoFullName}\n`);
  
  const [owner, repo] = repoFullName.split('/');
  if (!owner || !repo) {
    console.error('❌ 格式错误，请使用 "owner/repo" 格式');
    process.exit(1);
  }
  
  const repoData = await fetchRepoDetails(repoFullName);
  
  if (!repoData || repoData.message === 'Not Found') {
    console.error('❌ 仓库不存在或无法访问');
    process.exit(1);
  }
  
  console.error('📊 获取贡献者信息...');
  const contributors = await fetchContributors(repoFullName);
  
  console.error('✅ 完成\n');
  
  const report = generateReport(repoData, contributors);
  console.log(report);
}

main().catch(err => {
  console.error('错误:', err);
  process.exit(1);
});


Security scan verdicts — ClawScan: suspicious | static analysis: suspicious | VirusTotal: suspicious | SkillSpector: suspicious (MEDIUM)