核心变更: - 移除 task-dispatcher agent,将并行调度逻辑迁移至 add-trending 命令 - 重构 project-analyzer 支持单任务处理模式(通过 taskId 参数) - 优化并行处理策略:固定 3 实例分批处理,避免文件竞争 - 改进任务状态管理:pending → processing → completed/failed - 各 scraper 增加输出文件规范说明 文件变更: - 删除: .claude/agents/task-dispatcher.md - 修改: .claude/agents/project-analyzer.md(单任务模式、状态机) - 修改: .claude/commands/add-trending.md(直接并行调度) - 修改: .claude/settings.json(代理配置注释) - 新增: prisma/migrations/、scripts/scrape-huggingface.js 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
8.9 KiB
8.9 KiB
description
| description |
|---|
| Use the specialized agents workflow to automatically fetch AI projects from multiple data sources (GitHub Trending, Hugging Face, etc.) and ingest them into the database |
用户输入
$ARGUMENTS
在继续之前, 你必须考虑用户输入(如果不为空).
概述
本命令使用 专用 Agent 工作流 来完成多源数据获取和入库任务。核心原则:
- 所有数据处理逻辑由 Agent 执行,不在主窗口执行
- 使用 Task 工具调用各个 Agent,让 Agent 自主完成其职责
- 主窗口仅负责协调 Agent 调用,不直接处理业务逻辑
本命令从多个数据源并行爬取 AI 相关项目,经过去重、分析、质量评分后批量入库。
命令格式: /add-trending [source] [period] [limit]
参数说明:
source: 数据源,可选github/huggingface/paperswithcode/all(默认)period: 时间周期,可选daily(默认)/weekly/monthlylimit: 每个数据源获取的项目数量上限,默认 25
示例:
/add-trending- 默认参数(all, daily, 25个)/add-trending github- 仅 GitHub Trending/add-trending huggingface daily 10- 仅 Hugging Face,日榜10个/add-trending all weekly- 所有数据源,周榜
数据源配置
| 源名称 | Agent 名称 | URL |
|---|---|---|
| github | github-trending | https://github.com/trending |
| huggingface | huggingface-trending | https://huggingface.co/models |
| paperswithcode | papers-with-code | https://paperswithcode.com/ |
执行流程
Stage 1: 初始化工作区与并行爬取
-
解析参数:
- 从
$ARGUMENTS解析 source、period 和 limit - 默认值: source=all, period=daily, limit=25
- 从
-
创建工作区:
- 生成时间戳目录:
.trending-workspace/{YYYYMMDD-HHMMSS}/ - 初始化
progress.json文件:
{ "startTime": "2025-01-06T12:00:00Z", "currentStage": "scraping", "stages": { "scraping": "pending", "deduplicating": "pending", "analyzing": "pending", "ingesting": "pending" }, "config": { "source": "all", "period": "daily", "limit": 25 } } - 生成时间戳目录:
-
确定要调用的 scrapers: 根据 source 参数筛选:
source 调用的 scrapers all github-trending, huggingface-trending, papers-with-code github github-trending huggingface huggingface-trending paperswithcode papers-with-code -
并行调用 scrapers: 关键: 必须在单个消息中发送所有 Task 调用,以实现真正的并行执行。
示例(source=all):
Task(github-trending, {"period": "daily", "limit": 25, "workspace": ".trending-workspace/..."}) Task(huggingface-trending, {"period": "daily", "limit": 25, "workspace": ".trending-workspace/..."}) Task(papers-with-code, {"period": "daily", "limit": 25, "workspace": ".trending-workspace/..."}) -
等待所有 scraper 完成并汇总: 每个 scraper 输出到各自的文件:
scraped-github-projects.jsonscraped-huggingface-projects.jsonscraped-paperswithcode-projects.json
读取所有输出文件,合并生成
raw-projects.json:{ "metadata": { "timestamp": "2025-01-06T12:00:00Z", "period": "daily", "limit": 25, "sources": ["github", "huggingface"], "sourceCounts": { "github": 25, "huggingface": 20 }, "totalRaw": 45 }, "projects": [ { "source": "github", "name": "langchain-ai/langchain", "url": "https://github.com/langchain-ai/langchain", "description": "Building applications with LLMs through composability", "metadata": { "stars": 85432, "starsDelta": "+234", "language": "Python", "forks": 12543 } } ] } -
更新进度:
{ "startTime": "2025-01-06T12:00:00Z", "currentStage": "scraping", "stages": { "scraping": "completed", "deduplicating": "pending", "analyzing": "pending", "ingesting": "pending" }, "config": { "source": "all", "period": "daily", "limit": 25 } }
Stage 2: 统一去重
- 执行去重器:
- 使用 Task 工具调用
deduplicatoragent - 将 workspace 参数传递给去重器
- 去重器读取
raw-projects.json - 使用 dbhub PostgreSQL MCP 执行去重查询
- 输出
new-projects.json和task-queue.json
- 使用 Task 工具调用
Stage 3: 项目分析 (并行,固定 3 实例分批处理)
-
读取任务队列:
- 读取
task-queue.json - 提取所有
status: "pending"的任务 - 记录任务数量 N
- 读取
-
分批并行处理:
- 固定并行度: 3 个实例
- 每批处理: 3 个任务(最后一批可能少于 3 个)
- 批次数:
Math.ceil(N / 3) - 循环执行以下步骤,直到所有任务完成:
对每一批:
- 选取 3 个
status: "pending"的任务(记录其 taskId) - 使用单个消息发送 3 个 Task 工具调用(实现并行):
Task(project-analyzer, {"workspace": "...", "taskId": 1}) Task(project-analyzer, {"workspace": "...", "taskId": 2}) Task(project-analyzer, {"workspace": "...", "taskId": 3}) - 等待这 3 个实例完成
- 检查剩余任务:重新读取
task-queue.json,确认是否还有pending任务 - 继续下一批:如果有 pending 任务,重复上述步骤
-
等待所有批次完成:
- 确认
task-queue.json中没有status: "pending"或processing的任务
- 确认
-
汇总结果:
- 读取所有
analyzed-project-{taskId}.json文件 - 合并生成
analyzed-projects.json - 统计通过/失败的项目数量
- 读取所有
Stage 4: 批量入库
- 执行入库器:
- 使用 Task 工具调用
database-ingestoragent - 将 workspace 参数传递给入库器
- 调用
POST /api/webhook/projects - 输出
ingestion-result.json
- 使用 Task 工具调用
Stage 5: 生成报告
- 汇总所有阶段的结果
- 清理旧工作区(删除 7 天前的)
- 输出最终报告
工作区文件结构
.trending-workspace/{timestamp}/
├── scraped-github-projects.json # GitHub 原始数据
├── scraped-huggingface-projects.json # Hugging Face 原始数据
├── scraped-paperswithcode-projects.json # Papers with Code 原始数据
├── raw-projects.json # 所有数据源的汇总数据
├── new-projects.json # 去重后的新项目
├── task-queue.json # 分析任务队列
├── analyzed-projects.json # 分析完成的项目
├── ingestion-result.json # 入库结果
└── progress.json # 进度追踪
关键规则
- 必须使用单个消息发送多个 Task 调用:实现 scrapers 真正并行执行
- 必须使用 Agent 工作流:所有数据处理由专用 Agent 完成,不在主窗口执行
- 必须使用 Task 工具调用 Agent:让 Agent 自主完成其职责
- 必须先去重再分析,避免处理已存在的项目
- 必须进行质量评分,仅入库 >= 40 分的项目
- 必须保留工作区 7 天用于调试和审计
- 必须生成中英双语内容(name/nameEn, description/descriptionEn)
错误处理
| 场景 | 处理方式 |
|---|---|
| 某个数据源失败 | 其他源继续,记录失败源到 errors.json |
| 页面解析失败 | 跳过该项目,记录到 errors.json |
| 数据库连接失败 | 保存中间结果,提示用户稍后重试 |
| 部分任务失败 | 继续处理其他任务,最终汇总失败项 |
| 环境变量缺失 | 错误提示 "WEBHOOK_API_KEY 未配置" |
输出格式
执行完成后,输出类似以下格式的报告:
🚀 多源数据自动入库启动
⚙️ 配置: source=github, period=daily, limit=25
✅ Stage 1/4: 数据爬取
🔍 数据源: GitHub Trending
📊 GitHub: 25 个项目
📦 汇总: 25 个原始项目
✅ Stage 2/4: 统一去重
🆕 新项目: 18 个
🔄 重复: 7 个
✅ Stage 3/4: 项目分析 (18 个任务)
⭐ 通过质量评分: 16 个
❌ 质量不足: 2 个
✅ Stage 4/4: 批量入库
✅ 创建: 15 个
🔄 更新: 1 个
📊 最终报告
- 原始数据: 25 个 (GitHub: 25)
- 去重过滤: 7 个
- 质量过滤: 2 个
- 入库成功: 16 个
- 耗时: 约2分钟
📁 工作区: .trending-workspace/20250106-120000/
单数据源测试示例:
/add-trending github daily 5 # 仅测试 GitHub,5个项目
/add-trending huggingface # 仅测试 Hugging Face
/add-trending paperswithcode # 仅测试 Papers with Code
开始执行
开始执行上述流程,按照各 Stage 依次完成。