Files
agent-park/.claude/commands/add-trending.md
T
mzaxdandClaude 2d3796da43 refactor: 重构多源数据入库架构,移除任务派发器并优化并行处理
核心变更:
- 移除 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>
2026-01-06 20:59:16 +08:00

8.9 KiB
Raw Blame History

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 / monthly
  • limit: 每个数据源获取的项目数量上限,默认 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: 初始化工作区与并行爬取

  1. 解析参数:

    • $ARGUMENTS 解析 source、period 和 limit
    • 默认值: source=all, period=daily, limit=25
  2. 创建工作区:

    • 生成时间戳目录: .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
      }
    }
    
  3. 确定要调用的 scrapers: 根据 source 参数筛选:

    source 调用的 scrapers
    all github-trending, huggingface-trending, papers-with-code
    github github-trending
    huggingface huggingface-trending
    paperswithcode papers-with-code
  4. 并行调用 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/..."})
    
  5. 等待所有 scraper 完成并汇总: 每个 scraper 输出到各自的文件:

    • scraped-github-projects.json
    • scraped-huggingface-projects.json
    • scraped-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
          }
        }
      ]
    }
    
  6. 更新进度:

    {
      "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: 统一去重

  1. 执行去重器:
    • 使用 Task 工具调用 deduplicator agent
    • 将 workspace 参数传递给去重器
    • 去重器读取 raw-projects.json
    • 使用 dbhub PostgreSQL MCP 执行去重查询
    • 输出 new-projects.jsontask-queue.json

Stage 3: 项目分析 (并行,固定 3 实例分批处理)

  1. 读取任务队列:

    • 读取 task-queue.json
    • 提取所有 status: "pending" 的任务
    • 记录任务数量 N
  2. 分批并行处理:

    • 固定并行度: 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 任务,重复上述步骤
  3. 等待所有批次完成:

    • 确认 task-queue.json 中没有 status: "pending"processing 的任务
  4. 汇总结果:

    • 读取所有 analyzed-project-{taskId}.json 文件
    • 合并生成 analyzed-projects.json
    • 统计通过/失败的项目数量

Stage 4: 批量入库

  1. 执行入库器:
    • 使用 Task 工具调用 database-ingestor agent
    • 将 workspace 参数传递给入库器
    • 调用 POST /api/webhook/projects
    • 输出 ingestion-result.json

Stage 5: 生成报告

  1. 汇总所有阶段的结果
  2. 清理旧工作区(删除 7 天前的)
  3. 输出最终报告

工作区文件结构

.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    # 仅测试 GitHub5个项目
/add-trending huggingface        # 仅测试 Hugging Face
/add-trending paperswithcode     # 仅测试 Papers with Code

开始执行

开始执行上述流程,按照各 Stage 依次完成。