统一多源抓取
版本: 2.0(截至 2025 年 10 月功能完整)
概述
统一多源抓取允许您将来自多个源的知识组合成一个全面的 Claude 技能。您现在可以提取并智能合并来自所有源的信息,而不是在文档、GitHub 仓库或 PDF 手册之间进行选择。
为什么需要统一抓取?
问题:文档和代码经常随着时间的推移而分离。官方文档可能已过时,缺少代码中存在的功能,或记录已删除的功能。分别抓取文档和代码会创建两个不完整的技能。
解决方案:统一抓取:
- 从多个源(文档、GitHub、PDF)提取信息
- 检测冲突 在文档和实际代码实现之间
- 智能合并 冲突信息并保持透明
- 突出显示差异 使用内联警告(⚠️)
- 创建一个显示完整图景的单一全面技能
快速开始
1. 创建统一配置
创建具有多个源的配置文件:
{
"name": "react",
"description": "来自文档 + 代码库的完整 React 知识",
"merge_mode": "rule-based",
"sources": [
{
"type": "documentation",
"base_url": "https://react.dev/",
"extract_api": true,
"max_pages": 200
},
{
"type": "github",
"repo": "facebook/react",
"include_code": true,
"code_analysis_depth": "surface",
"max_issues": 100
}
]
}
2. 抓取和构建
skill-seekers unified --config configs/react_unified.json
该工具将:
- ✅ 阶段 1:抓取所有源(文档 + GitHub)
- ✅ 阶段 2:检测源之间的冲突
- ✅ 阶段 3:智能合并冲突
- ✅ 阶段 4:构建具有冲突透明度的统一技能
3. 打包和上传
skill-seekers package output/react/
配置格式
统一配置结构
{
"name": "skill-name",
"description": "何时使用此技能",
"merge_mode": "rule-based|claude-enhanced",
"sources": [
{
"type": "documentation|github|pdf",
...源特定字段...
}
]
}
文档源
{
"type": "documentation",
"base_url": "https://docs.example.com/",
"extract_api": true,
"selectors": {
"main_content": "article",
"title": "h1",
"code_blocks": "pre code"
},
"url_patterns": {
"include": [],
"exclude": ["/blog/"]
},
"categories": {
"getting_started": ["intro", "tutorial"],
"api": ["api", "reference"]
},
"rate_limit": 0.5,
"max_pages": 200
}
GitHub 源
{
"type": "github",
"repo": "owner/repo",
"github_token": "ghp_...",
"include_issues": true,
"max_issues": 100,
"include_changelog": true,
"include_releases": true,
"include_code": true,
"code_analysis_depth": "surface|deep|full",
"file_patterns": [
"src/**/*.js",
"lib/**/*.ts"
]
}
代码分析深度:
surface(默认):基本结构,无代码分析deep:提取类/函数签名、参数、返回类型full:完整的 AST 分析(昂贵)
PDF 源
{
"type": "pdf",
"path": "/path/to/manual.pdf",
"extract_tables": false,
"ocr": false,
"password": "optional-password"
}
冲突检测
统一抓取器自动检测 4 种类型的冲突:
1. 文档中缺失
严重性:中等 描述:API 存在于代码中但未记录
示例:
# 代码有此方法:
def move_local_x(self, delta: float, snap: bool = False) -> None:
"""沿局部 X 轴移动节点"""
# 但文档没有提到它
建议:为此 API 添加文档
2. 代码中缺失
严重性:高 描述:API 已记录但在代码库中未找到
示例:
# 文档说:
def rotate(angle: float) -> None
# 但代码没有此函数
建议:更新文档以删除此 API,或将其添加到代码库
3. 签名不匹配
严重性:中高 描述:API 在两者中都存在但签名不同
示例:
# 文档说:
def move_local_x(delta: float)
# 代码有:
def move_local_x(delta: float, snap: bool = False)
建议:更新文档以匹配实际签名
4. 描述不匹配
严重性:低 描述:不同的描述/文档字符串
合并模式
基于规则的合并(默认)
使用预定义规则进行快速、确定性的合并:
- 如果 API 仅在文档中 → 包含带
[DOCS_ONLY]标签 - 如果 API 仅在代码中 → 包含带
[UNDOCUMENTED]标签 - 如果两者完全匹配 → 正常包含
- 如果存在冲突 → 优先使用代码签名,保留文档描述
何时使用:
- 快速合并(< 1 秒)
- 自动化工作流程
- 您不需要人工监督
示例:
skill-seekers unified --config config.json --merge-mode rule-based
Claude 增强合并
使用本地 Claude Code 进行 AI 驱动的协调:
- 使用 Claude Code 打开新终端
- 提供冲突上下文和说明
- Claude 分析并创建协调的 API 参考
- 人类可以在最终确定之前审查和调整
何时使用:
- 需要判断的复杂冲突
- 您想要最高质量的合并
- 您有时间进行人工监督
示例:
skill-seekers unified --config config.json --merge-mode claude-enhanced
技能输出结构
统一抓取器创建此结构:
output/skill-name/
├── SKILL.md # 带合并 API 的主技能文件
├── references/
│ ├── documentation/ # 文档参考
│ │ └── index.md
│ ├── github/ # GitHub 参考
│ │ ├── README.md
│ │ ├── issues.md
│ │ └── releases.md
│ ├── pdf/ # PDF 参考(如果适用)
│ │ └── index.md
│ ├── api/ # 合并的 API 参考
│ │ └── merged_api.md
│ └── conflicts.md # 详细的冲突报告
├── scripts/ # 空(用于用户脚本)
└── assets/ # 空(用于用户资产)
SKILL.md 格式
# React
结合官方文档和 React 代码库见解的完整 React 知识库。
## 📚 源
此技能结合了来自多个源的知识:
- ✅ **文档**:https://react.dev/
- 页数:200
- ✅ **GitHub 仓库**:facebook/react
- 代码分析:surface
- 问题:100
## ⚠️ 数据质量
**检测到 5 个冲突** 在源之间。
**冲突细分:**
- missing_in_docs:3
- missing_in_code:2
请参阅 `references/conflicts.md` 获取详细的冲突信息。
## 🔧 API 参考
*从文档和代码分析合并*
### ✅ 已验证的 API
*文档和代码一致*
#### `useState(initialValue)`
...
### ⚠️ 有冲突的 API
*文档和代码不同*
#### `useEffect(callback, deps?)`
⚠️ **冲突**:文档签名与代码实现不同
**文档说:**
useEffect(callback: () => void, deps: any[])
**代码实现:**
useEffect(callback: () => void | (() => void), deps?: readonly any[])
*源:both*
---
示例
示例 1:React(文档 + GitHub)
{
"name": "react",
"description": "完整的 React 框架知识",
"merge_mode": "rule-based",
"sources": [
{
"type": "documentation",
"base_url": "https://react.dev/",
"extract_api": true,
"max_pages": 200
},
{
"type": "github",
"repo": "facebook/react",
"include_code": true,
"code_analysis_depth": "surface"
}
]
}
示例 2:Django(文档 + GitHub)
{
"name": "django",
"description": "完整的 Django 框架知识",
"merge_mode": "rule-based",
"sources": [
{
"type": "documentation",
"base_url": "https://docs.djangoproject.com/en/stable/",
"extract_api": true,
"max_pages": 300
},
{
"type": "github",
"repo": "django/django",
"include_code": true,
"code_analysis_depth": "deep",
"file_patterns": [
"django/db/**/*.py",
"django/views/**/*.py"
]
}
]
}
示例 3:混合源(文档 + GitHub + PDF)
{
"name": "godot",
"description": "完整的 Godot 引擎知识",
"merge_mode": "claude-enhanced",
"sources": [
{
"type": "documentation",
"base_url": "https://docs.godotengine.org/en/stable/",
"extract_api": true,
"max_pages": 500
},
{
"type": "github",
"repo": "godotengine/godot",
"include_code": true,
"code_analysis_depth": "deep"
},
{
"type": "pdf",
"path": "/path/to/godot_manual.pdf",
"extract_tables": true
}
]
}
命令参考
统一抓取器
# 基本用法
skill-seekers unified --config configs/react_unified.json
# 覆盖合并模式
skill-seekers unified --config configs/react_unified.json --merge-mode claude-enhanced
# 使用缓存数据(跳过重新抓取)
skill-seekers unified --config configs/react_unified.json --skip-scrape
MCP 集成
统一抓取器与 MCP 完全集成。scrape_docs 工具自动检测统一与传统配置,并路由到适当的抓取器。
# MCP 工具用法
{
"name": "scrape_docs",
"arguments": {
"config_path": "configs/react_unified.json",
"merge_mode": "rule-based" # 可选覆盖
}
}
该工具将:
- 自动检测统一格式
- 路由到
unified_scraper.py - 应用指定的合并模式
- 返回全面的输出
向后兼容性
传统配置仍然有效! 系统自动检测传统单源配置并路由到原始 doc_scraper.py。
// 传统配置(仍然有效)
{
"name": "react",
"base_url": "https://react.dev/",
...
}
// 自动检测为传统格式
// 路由到 doc_scraper.py
架构
组件
- config_validator.py:验证统一和传统配置
- code_analyzer.py:以可配置的深度提取代码签名
- conflict_detector.py:检测源之间的 API 冲突
- merge_sources.py:实现基于规则和 Claude 增强的合并
- unified_scraper.py:主协调器
- unified_skill_builder.py:生成最终技能结构
- skill_seeker_mcp/server.py:具有自动检测的 MCP 集成
数据流
统一配置
↓
ConfigValidator(验证格式)
↓
UnifiedScraper.run()
↓
┌────────────────────────────────────┐
│ 阶段 1:抓取所有源 │
│ - 文档 → doc_scraper │
│ - GitHub → github_scraper │
│ - PDF → pdf_scraper │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ 阶段 2:检测冲突 │
│ - ConflictDetector │
│ - 比较文档 API 与代码 API │
│ - 按类型和严重性分类 │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ 阶段 3:合并源 │
│ - RuleBasedMerger(快速) │
│ - 或 ClaudeEnhancedMerger(AI) │
│ - 创建统一的 API 参考 │
└────────────────────────────────────┘
↓
┌────────────────────────────────────┐
│ 阶段 4:构建技能 │
│ - UnifiedSkillBuilder │
│ - 生成带冲突的 SKILL.md │
│ - 创建参考结构 │
│ - 生成冲突报告 │
└────────────────────────────────────┘
↓
统一技能(.zip 就绪)
最佳实践
1. 从基于规则的合并开始
基于规则的合并快速且适用于大多数情况。只有在需要人工监督时才使用 Claude 增强。
2. 使用表面级代码分析
code_analysis_depth: "surface" 通常就足够了。深度分析昂贵且很少需要。
3. 限制 GitHub 问题
max_issues: 100 是一个很好的默认值。超过 200 个问题很少增加价值。
4. 对文件模式要具体
"file_patterns": [
"src/**/*.js", // 好:特定路径
"lib/**/*.ts"
]
// 不推荐:
"file_patterns": ["**/*.js"] // 太宽泛,慢
5. 监控冲突报告
始终查看 references/conflicts.md 以了解源之间的差异。
故障排除
未检测到冲突
可能原因:
- 文档源中的
extract_api: false - GitHub 源中的
include_code: false - 代码分析未找到 API(检查
code_analysis_depth)
解决方案:确保两个源都启用了 API 提取
冲突太多
可能原因:
- 模糊匹配阈值太严格
- 文档使用不同的命名约定
- 旧文档版本
解决方案:手动审查冲突并调整合并策略
合并时间太长
可能原因:
- 使用
code_analysis_depth: "full"(非常慢) - 文件模式太多
- 大型仓库
解决方案:
- 使用
"surface"或"deep"分析 - 缩小文件模式
- 增加
rate_limit
未来增强
计划的功能:
- 自动冲突解决策略
- 跨版本的冲突趋势分析
- 多版本比较(文档 v1 与 v2)
- 自定义合并规则 DSL
- 冲突置信度分数
下一步
更新日志
v2.0(2025 年 10 月):统一多源抓取功能完整
- ✅ 统一格式的配置验证
- ✅ 使用 AST 解析的深度代码分析
- ✅ 冲突检测(4 种类型,3 个严重级别)
- ✅ 基于规则的合并
- ✅ Claude 增强合并
- ✅ 具有内联冲突警告的统一技能构建器
- ✅ 具有自动检测的 MCP 集成
- ✅ 与传统配置的向后兼容性
- ✅ 全面的测试和文档