docs(phase-06): research code consolidation domain
This commit is contained in:
@@ -0,0 +1,448 @@
|
||||
# Phase 6: 代码整合 - Research
|
||||
|
||||
**Researched:** 2026-03-16
|
||||
**Domain:** Python 代码重构、模块整合、导入路径迁移
|
||||
**Confidence:** HIGH
|
||||
|
||||
## Summary
|
||||
|
||||
本阶段将三个独立的 Python 模块整合进 kb-workflow 包:
|
||||
1. `kb-bilibili-metadata/` (3 files) - B站元数据提取
|
||||
2. `kb-zhihu-metadata/` (5 files) - 知乎内容提取
|
||||
3. `kb_pipeline/` (20 files) - 工作流管道核心
|
||||
|
||||
整合后的目录结构将使所有代码统一在 `kb-workflow` 包下,便于维护和分发。主要工作是文件移动和导入路径更新,不涉及功能改动。
|
||||
|
||||
**Primary recommendation:** 按照先 metadata 后 pipeline 的顺序,分步整合,每步完成后运行测试验证。
|
||||
|
||||
<user_constraints>
|
||||
## User Constraints (from CONTEXT.md)
|
||||
|
||||
### 目录结构
|
||||
- **完全扁平化**: kb-workflow/metadata/ 和 kb-workflow/pipeline/ 作为顶级子目录
|
||||
- **元数据目录**: kb-workflow/metadata/bilibili_extractor.py, zhihu_extractor.py 等
|
||||
- **Pipeline 目录**: kb-workflow/pipeline/processors/, kb-workflow/pipeline/platforms/ 等
|
||||
- **保留原文件名**: bilibili_extractor.py 不重命名为 bilibili.py,保持迁移安全
|
||||
|
||||
### 导入策略
|
||||
- **外部导入**: 统一从 kb_workflow 导入
|
||||
- `from kb_workflow.metadata.bilibili_extractor import ...`
|
||||
- `from kb_workflow.pipeline.processors import ...`
|
||||
- **内部导入**: 使用绝对导入
|
||||
- `from kb_workflow.pipeline.processors.base import BaseProcessor`
|
||||
- **更新范围**: 所有测试文件、CLI 入口、处理器间引用
|
||||
|
||||
### 整合顺序
|
||||
- **先 metadata 后 pipeline**:
|
||||
1. 移动 kb-bilibili-metadata → kb-workflow/metadata/
|
||||
2. 移动 kb-zhihu-metadata → kb-workflow/metadata/
|
||||
3. 更新 metadata 相关导入
|
||||
4. 运行测试验证
|
||||
5. 移动 kb_pipeline → kb-workflow/pipeline/
|
||||
6. 更新 pipeline 相关导入
|
||||
7. 运行测试验证
|
||||
|
||||
### 验证策略
|
||||
- **分步验证**: 每个子整合完成后运行测试
|
||||
- **测试命令**: `pytest tests/ -v`
|
||||
- **失败处理**: 测试失败时不继续下一步,先修复问题
|
||||
|
||||
### 清理策略
|
||||
- **立即删除**: 整合完成且测试通过后立即删除原目录
|
||||
- **删除目录**: kb-bilibili-metadata/, kb-zhihu-metadata/, kb_pipeline/
|
||||
- **Git 提交**: 每个子整合单独提交,便于回滚
|
||||
|
||||
### Claude's Discretion
|
||||
- 具体导入路径更新时的细节调整
|
||||
- 处理意外的循环导入问题
|
||||
- 测试文件的导入更新方式
|
||||
|
||||
### Deferred Ideas (OUT OF SCOPE)
|
||||
None — discussion stayed within phase scope
|
||||
</user_constraints>
|
||||
|
||||
<phase_requirements>
|
||||
## Phase Requirements
|
||||
|
||||
| ID | Description | Research Support |
|
||||
|----|-------------|-----------------|
|
||||
| MET-01 | kb-bilibili-metadata 整合进 kb-workflow/metadata/ | 移动 bilibili_extractor.py, bilibili_metadata.py, __init__.py |
|
||||
| MET-02 | kb-zhihu-metadata 整合进 kb-workflow/metadata/ | 移动 zhihu_extractor.py, zhihu_metadata.py, zhihu_article_crawler.py, markdown_converter.py, __init__.py |
|
||||
| MET-03 | 删除独立的 kb-bilibili-metadata 目录 | 整合验证后删除 |
|
||||
| MET-04 | 删除独立的 kb-zhihu-metadata 目录 | 整合验证后删除 |
|
||||
| MET-05 | 更新所有导入路径指向新位置 | 见下方导入映射表 |
|
||||
| PIP-01 | kb_pipeline/ 合并进 kb-workflow/ | 移动全部 20 个文件,保持子目录结构 |
|
||||
| PIP-02 | 保持 processors/, platforms/, schemas.py, state.py, config.py 结构 | 直接移动,不改结构 |
|
||||
| PIP-03 | 删除独立的 kb_pipeline 目录 | 整合验证后删除 |
|
||||
| PIP-04 | 更新 CLI 入口导入路径 | 更新 kb_workflow.py 中的导入 |
|
||||
</phase_requirements>
|
||||
|
||||
## Standard Stack
|
||||
|
||||
### Core
|
||||
| Library | Version | Purpose | Why Standard |
|
||||
|---------|---------|---------|--------------|
|
||||
| Python | 3.12+ | 运行时 | 项目要求 |
|
||||
| pytest | latest | 测试框架 | 已有测试基础设施 |
|
||||
|
||||
### Supporting
|
||||
| Library | Version | Purpose | When to Use |
|
||||
|---------|---------|---------|-------------|
|
||||
| grep/sed | - | 批量查找替换导入 | 导入路径更新 |
|
||||
|
||||
### Alternatives Considered
|
||||
| Instead of | Could Use | Tradeoff |
|
||||
|------------|-----------|----------|
|
||||
| 手动移动文件 | git mv | git mv 保留历史,推荐使用 |
|
||||
| sed 替换 | IDE 重构 | IDE 更安全但需手动操作每个文件 |
|
||||
|
||||
## Architecture Patterns
|
||||
|
||||
### Target Project Structure
|
||||
```
|
||||
kb-workflow/
|
||||
├── kb_workflow.py # CLI 入口 (已存在)
|
||||
├── metadata/ # 新建
|
||||
│ ├── __init__.py
|
||||
│ ├── bilibili_extractor.py
|
||||
│ ├── bilibili_metadata.py
|
||||
│ ├── zhihu_extractor.py
|
||||
│ ├── zhihu_metadata.py
|
||||
│ ├── zhihu_article_crawler.py
|
||||
│ └── markdown_converter.py
|
||||
└── pipeline/ # 新建
|
||||
├── __init__.py
|
||||
├── pipeline.py
|
||||
├── schemas.py
|
||||
├── config.py
|
||||
├── state.py
|
||||
├── errors.py
|
||||
├── retry.py
|
||||
├── idempotency.py
|
||||
├── link_parser.py
|
||||
├── processors/
|
||||
│ ├── __init__.py
|
||||
│ ├── base.py
|
||||
│ ├── parse.py
|
||||
│ ├── download.py
|
||||
│ ├── asr.py
|
||||
│ ├── analyze.py
|
||||
│ └── archive.py
|
||||
└── platforms/
|
||||
├── __init__.py
|
||||
├── base.py
|
||||
├── bilibili.py
|
||||
└── zhihu.py
|
||||
```
|
||||
|
||||
### Pattern 1: 导入路径迁移
|
||||
**What:** 将 `from kb_pipeline.xxx` 改为 `from kb_workflow.pipeline.xxx`
|
||||
**When to use:** 所有整合后的导入语句
|
||||
|
||||
**旧导入 → 新导入映射表:**
|
||||
|
||||
| 旧路径 | 新路径 |
|
||||
|--------|--------|
|
||||
| `from kb_pipeline.xxx` | `from kb_workflow.pipeline.xxx` |
|
||||
| `from bilibili_extractor import` | `from kb_workflow.metadata.bilibili_extractor import` |
|
||||
| `from zhihu_extractor import` | `from kb_workflow.metadata.zhihu_extractor import` |
|
||||
|
||||
**CLI 入口 (kb_workflow.py) 导入更新:**
|
||||
```python
|
||||
# 旧
|
||||
from kb_pipeline.config import get_settings
|
||||
from kb_pipeline.pipeline import Pipeline
|
||||
from kb_pipeline.processors import (...)
|
||||
from kb_pipeline.schemas import PipelineConfig
|
||||
|
||||
# 新
|
||||
from kb_workflow.pipeline.config import get_settings
|
||||
from kb_workflow.pipeline.pipeline import Pipeline
|
||||
from kb_workflow.pipeline.processors import (...)
|
||||
from kb_workflow.pipeline.schemas import PipelineConfig
|
||||
```
|
||||
|
||||
**Platform adapters 导入更新 (platforms/bilibili.py):**
|
||||
```python
|
||||
# 旧 - 动态路径导入
|
||||
_BILIBILI_METADATA_PATH = Path(__file__).parent.parent.parent / "kb-bilibili-metadata"
|
||||
from bilibili_extractor import BilibiliExtractor
|
||||
|
||||
# 新 - 标准包导入
|
||||
from kb_workflow.metadata.bilibili_extractor import BilibiliExtractor
|
||||
```
|
||||
|
||||
**Platform adapters 导入更新 (platforms/zhihu.py):**
|
||||
```python
|
||||
# 旧 - 动态路径导入
|
||||
_kb_zhihu_path = Path(__file__).parent.parent.parent / "kb-zhihu-metadata"
|
||||
from zhihu_extractor import ZhihuPlaywrightExtractor
|
||||
|
||||
# 新 - 标准包导入
|
||||
from kb_workflow.metadata.zhihu_extractor import ZhihuPlaywrightExtractor
|
||||
```
|
||||
|
||||
### Pattern 2: 内部相对导入转绝对导入
|
||||
**What:** pipeline 内部模块使用绝对导入
|
||||
**When to use:** pipeline 子模块之间的相互引用
|
||||
|
||||
**示例 (processors/base.py):**
|
||||
```python
|
||||
# 旧
|
||||
from kb_pipeline.config import get_settings
|
||||
from kb_pipeline.schemas import StepInput, StepOutput
|
||||
|
||||
# 新
|
||||
from kb_workflow.pipeline.config import get_settings
|
||||
from kb_workflow.pipeline.schemas import StepInput, StepOutput
|
||||
```
|
||||
|
||||
### Anti-Patterns to Avoid
|
||||
- **不要使用相对导入**: `from .xxx import yyy` 在包结构变化后容易出问题
|
||||
- **不要保留 sys.path 操作**: 删除类似 `sys.path.insert(0, ...)` 的动态路径代码
|
||||
- **不要跳过测试验证**: 每步整合后必须运行测试
|
||||
|
||||
## Don't Hand-Roll
|
||||
|
||||
| Problem | Don't Build | Use Instead | Why |
|
||||
|---------|-------------|-------------|-----|
|
||||
| 批量查找导入 | 手动逐文件查找 | `grep -rn "from kb_pipeline"` | 确保不遗漏 |
|
||||
| 保留 Git 历史 | cp + rm | `git mv` | 保留文件历史 |
|
||||
| 验证导入正确性 | 手动检查 | `python -c "from kb_workflow.pipeline import ..."` | 快速验证 |
|
||||
|
||||
**Key insight:** 使用 `git mv` 移动文件可以保留 Git 历史,便于后续追踪变更。
|
||||
|
||||
## Common Pitfalls
|
||||
|
||||
### Pitfall 1: 循环导入
|
||||
**What goes wrong:** 整合后模块间可能产生循环依赖
|
||||
**Why it happens:** 包结构变化后,__init__.py 的导入顺序可能引发问题
|
||||
**How to avoid:**
|
||||
1. 在 __init__.py 中只导出必要的符号
|
||||
2. 使用延迟导入 (lazy import) 解决循环依赖
|
||||
**Warning signs:** `ImportError: cannot import name 'xxx' from partially initialized module`
|
||||
|
||||
### Pitfall 2: 遗漏测试文件导入
|
||||
**What goes wrong:** 只更新了源码导入,忘记更新测试文件
|
||||
**Why it happens:** 测试文件数量多,分散在不同目录
|
||||
**How to avoid:** 使用 grep 全面搜索所有 `from kb_` 导入
|
||||
**Warning signs:** `pytest` 运行时报 ImportError
|
||||
|
||||
### Pitfall 3: sys.path 动态操作
|
||||
**What goes wrong:** 旧代码中有 `sys.path.insert()` 操作指向已删除的目录
|
||||
**Why it happens:** 原独立模块使用动态路径相互引用
|
||||
**How to avoid:** 删除所有 `sys.path` 操作,改用标准包导入
|
||||
**Warning signs:** 代码中仍有 `Path(__file__).parent.parent / "kb-xxx"`
|
||||
|
||||
### Pitfall 4: __init__.py 导出不一致
|
||||
**What goes wrong:** __init__.py 中导出的符号与实际模块不匹配
|
||||
**Why it happens:** 移动文件后忘记更新 __init__.py
|
||||
**How to avoid:** 移动后立即更新 __init__.py 的 __all__ 列表
|
||||
**Warning signs:** `from kb_workflow.pipeline import xxx` 失败
|
||||
|
||||
## Code Examples
|
||||
|
||||
### 整合后的 metadata/__init__.py
|
||||
```python
|
||||
"""
|
||||
KB Workflow Metadata Module
|
||||
|
||||
提供 B站和知乎的元数据提取功能
|
||||
"""
|
||||
|
||||
from .bilibili_extractor import BilibiliExtractor
|
||||
from .zhihu_extractor import ZhihuPlaywrightExtractor
|
||||
|
||||
__all__ = [
|
||||
"BilibiliExtractor",
|
||||
"ZhihuPlaywrightExtractor",
|
||||
]
|
||||
```
|
||||
|
||||
### 整合后的 pipeline/__init__.py
|
||||
```python
|
||||
"""KB Pipeline - 工作流管道基础设施
|
||||
|
||||
提供内容处理工作流的核心 Schema 和工具。
|
||||
"""
|
||||
|
||||
# 注意:所有导入路径从 kb_pipeline.xxx 改为 kb_workflow.pipeline.xxx
|
||||
from kb_workflow.pipeline.schemas import (
|
||||
StepInput,
|
||||
StepOutput,
|
||||
StepResult,
|
||||
StepStatus,
|
||||
StepRecord,
|
||||
WorkflowState,
|
||||
StepDefinition,
|
||||
)
|
||||
from kb_workflow.pipeline.state import WorkflowStateManager
|
||||
from kb_workflow.pipeline.errors import (
|
||||
KBError,
|
||||
NetworkError,
|
||||
ValidationError,
|
||||
SystemError,
|
||||
AuthError,
|
||||
ErrorType,
|
||||
)
|
||||
from kb_workflow.pipeline.config import KBSettings, get_settings
|
||||
from kb_workflow.pipeline.retry import retry_on_network_error
|
||||
from kb_workflow.pipeline.link_parser import LinkParser, ParsedLink
|
||||
from kb_workflow.pipeline.idempotency import IdempotencyChecker
|
||||
from kb_workflow.pipeline.platforms import PlatformAdapter, BilibiliAdapter, ZhihuAdapter
|
||||
|
||||
__all__ = [
|
||||
# Schemas
|
||||
"StepInput",
|
||||
"StepOutput",
|
||||
"StepResult",
|
||||
"StepStatus",
|
||||
"StepRecord",
|
||||
"WorkflowState",
|
||||
"StepDefinition",
|
||||
# State
|
||||
"WorkflowStateManager",
|
||||
# Errors
|
||||
"KBError",
|
||||
"NetworkError",
|
||||
"ValidationError",
|
||||
"SystemError",
|
||||
"AuthError",
|
||||
"ErrorType",
|
||||
# Config
|
||||
"KBSettings",
|
||||
"get_settings",
|
||||
# Retry
|
||||
"retry_on_network_error",
|
||||
# Link Parser
|
||||
"LinkParser",
|
||||
"ParsedLink",
|
||||
# Idempotency
|
||||
"IdempotencyChecker",
|
||||
# Platform Adapters
|
||||
"PlatformAdapter",
|
||||
"BilibiliAdapter",
|
||||
"ZhihuAdapter",
|
||||
]
|
||||
|
||||
__version__ = "0.1.0"
|
||||
```
|
||||
|
||||
### 查找所有需要更新的导入
|
||||
```bash
|
||||
# 查找所有 kb_pipeline 导入
|
||||
grep -rn "from kb_pipeline" --include="*.py" /home/starmen1265/work/kb-skills/
|
||||
|
||||
# 查找所有 bilibili_extractor 导入
|
||||
grep -rn "from bilibili_extractor\|import bilibili_extractor" --include="*.py" /home/starmen1265/work/kb-skills/
|
||||
|
||||
# 查找所有 zhihu_extractor 导入
|
||||
grep -rn "from zhihu_extractor\|import zhihu_extractor" --include="*.py" /home/starmen1265/work/kb-skills/
|
||||
```
|
||||
|
||||
## State of the Art
|
||||
|
||||
| Old Approach | Current Approach | When Changed | Impact |
|
||||
|--------------|------------------|--------------|--------|
|
||||
| 独立包 + sys.path | 统一包结构 | Phase 6 | 简化导入,便于维护 |
|
||||
|
||||
**Deprecated/outdated:**
|
||||
- 动态路径导入 (`sys.path.insert`): 应删除,改用标准包导入
|
||||
|
||||
## Open Questions
|
||||
|
||||
1. **是否需要更新 pytest.ini 的 pythonpath?**
|
||||
- 当前配置 `pythonpath = .` 应该仍然有效
|
||||
- 建议:整合后验证 `pytest tests/` 是否正常工作
|
||||
|
||||
2. **kb-workflow 是否需要 setup.py 或 pyproject.toml?**
|
||||
- 当前项目似乎不使用打包
|
||||
- 建议:本阶段不涉及,保持现状
|
||||
|
||||
## Validation Architecture
|
||||
|
||||
### Test Framework
|
||||
| Property | Value |
|
||||
|----------|-------|
|
||||
| Framework | pytest |
|
||||
| Config file | pytest.ini (pythonpath = ., testpaths = tests) |
|
||||
| Quick run command | `pytest tests/ -v --tb=short` |
|
||||
| Full suite command | `pytest tests/ -v` |
|
||||
|
||||
### Phase Requirements → Test Map
|
||||
| Req ID | Behavior | Test Type | Automated Command | File Exists? |
|
||||
|--------|----------|-----------|-------------------|-------------|
|
||||
| MET-01 | bilibili_extractor 可从新位置导入 | import test | `python -c "from kb_workflow.metadata.bilibili_extractor import BilibiliExtractor"` | N/A - Wave 0 |
|
||||
| MET-02 | zhihu_extractor 可从新位置导入 | import test | `python -c "from kb_workflow.metadata.zhihu_extractor import ZhihuPlaywrightExtractor"` | N/A - Wave 0 |
|
||||
| MET-05 | 所有导入路径更新正确 | import test | `python -c "from kb_workflow.pipeline import Pipeline, get_settings"` | N/A - Wave 0 |
|
||||
| PIP-01 | pipeline 模块可从新位置导入 | unit | `pytest tests/test_pipeline/ -v` | ✅ 已存在 |
|
||||
| PIP-02 | processors 功能正常 | unit | `pytest tests/test_processors/ -v` | ✅ 已存在 |
|
||||
| PIP-04 | CLI 入口可用 | integration | `python kb-workflow/kb_workflow.py --help` | N/A - Wave 0 |
|
||||
|
||||
### Sampling Rate
|
||||
- **Per task commit:** `pytest tests/ -v --tb=short -x` (失败即停)
|
||||
- **Per wave merge:** `pytest tests/ -v`
|
||||
- **Phase gate:** Full suite green before `/gsd:verify-work`
|
||||
|
||||
### Wave 0 Gaps
|
||||
- [ ] `tests/test_imports.py` — 验证所有新导入路径可用的测试
|
||||
- [ ] 导入验证脚本 — 快速检查所有模块可导入
|
||||
|
||||
**建议 Wave 0 任务:**
|
||||
1. 创建 `tests/test_imports.py` 测试文件
|
||||
2. 添加以下测试用例:
|
||||
- `test_import_metadata_bilibili()`: 验证 `from kb_workflow.metadata.bilibili_extractor import BilibiliExtractor`
|
||||
- `test_import_metadata_zhihu()`: 验证 `from kb_workflow.metadata.zhihu_extractor import ZhihuPlaywrightExtractor`
|
||||
- `test_import_pipeline_core()`: 验证 `from kb_workflow.pipeline import Pipeline, get_settings`
|
||||
- `test_import_pipeline_processors()`: 验证所有 processors 可导入
|
||||
- `test_import_pipeline_platforms()`: 验证所有 platforms 可导入
|
||||
|
||||
### 整合验证命令
|
||||
|
||||
**验证 metadata 整合:**
|
||||
```bash
|
||||
# 1. 验证模块可导入
|
||||
python -c "from kb_workflow.metadata.bilibili_extractor import BilibiliExtractor; print('bilibili OK')"
|
||||
python -c "from kb_workflow.metadata.zhihu_extractor import ZhihuPlaywrightExtractor; print('zhihu OK')"
|
||||
|
||||
# 2. 运行相关测试
|
||||
pytest tests/test_platforms/test_bilibili.py tests/test_platforms/test_zhihu.py -v
|
||||
```
|
||||
|
||||
**验证 pipeline 整合:**
|
||||
```bash
|
||||
# 1. 验证模块可导入
|
||||
python -c "from kb_workflow.pipeline import Pipeline; print('pipeline OK')"
|
||||
python -c "from kb_workflow.pipeline.processors import ParseProcessor, DownloadProcessor, ASRProcessor, AnalyzeProcessor, ArchiveProcessor; print('processors OK')"
|
||||
|
||||
# 2. 运行全量测试
|
||||
pytest tests/ -v
|
||||
```
|
||||
|
||||
**验证 CLI 可用:**
|
||||
```bash
|
||||
cd kb-workflow && python kb_workflow.py --help
|
||||
```
|
||||
|
||||
## Sources
|
||||
|
||||
### Primary (HIGH confidence)
|
||||
- 项目源码分析 - 直接阅读 kb-bilibili-metadata/, kb-zhihu-metadata/, kb_pipeline/, kb-workflow/
|
||||
- CONTEXT.md - 用户决策和约束
|
||||
- pytest.ini - 测试配置
|
||||
|
||||
### Secondary (MEDIUM confidence)
|
||||
- None required - 本阶段为纯代码迁移,无需外部资料
|
||||
|
||||
### Tertiary (LOW confidence)
|
||||
- None
|
||||
|
||||
## Metadata
|
||||
|
||||
**Confidence breakdown:**
|
||||
- Standard stack: HIGH - 项目已使用 Python 3.12+ 和 pytest
|
||||
- Architecture: HIGH - 目标结构已在 CONTEXT.md 中明确
|
||||
- Pitfalls: HIGH - 基于对现有代码的完整分析
|
||||
|
||||
**Research date:** 2026-03-16
|
||||
**Valid until:** 30 days (稳定的 Python 迁移模式)
|
||||
Reference in New Issue
Block a user