16 KiB
Phase 6: 代码整合 - Research
Researched: 2026-03-16 Domain: Python 代码重构、模块整合、导入路径迁移 Confidence: HIGH
Summary
本阶段将三个独立的 Python 模块整合进 kb-workflow 包:
kb-bilibili-metadata/(3 files) - B站元数据提取kb-zhihu-metadata/(5 files) - 知乎内容提取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:
- 移动 kb-bilibili-metadata → kb-workflow/metadata/
- 移动 kb-zhihu-metadata → kb-workflow/metadata/
- 更新 metadata 相关导入
- 运行测试验证
- 移动 kb_pipeline → kb-workflow/pipeline/
- 更新 pipeline 相关导入
- 运行测试验证
验证策略
- 分步验证: 每个子整合完成后运行测试
- 测试命令:
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) 导入更新:
# 旧
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):
# 旧 - 动态路径导入
_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):
# 旧 - 动态路径导入
_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):
# 旧
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:
- 在 __init__.py 中只导出必要的符号
- 使用延迟导入 (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
"""
KB Workflow Metadata Module
提供 B站和知乎的元数据提取功能
"""
from .bilibili_extractor import BilibiliExtractor
from .zhihu_extractor import ZhihuPlaywrightExtractor
__all__ = [
"BilibiliExtractor",
"ZhihuPlaywrightExtractor",
]
整合后的 pipeline/__init__.py
"""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"
查找所有需要更新的导入
# 查找所有 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
-
是否需要更新 pytest.ini 的 pythonpath?
- 当前配置
pythonpath = .应该仍然有效 - 建议:整合后验证
pytest tests/是否正常工作
- 当前配置
-
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 任务:
- 创建
tests/test_imports.py测试文件 - 添加以下测试用例:
test_import_metadata_bilibili(): 验证from kb_workflow.metadata.bilibili_extractor import BilibiliExtractortest_import_metadata_zhihu(): 验证from kb_workflow.metadata.zhihu_extractor import ZhihuPlaywrightExtractortest_import_pipeline_core(): 验证from kb_workflow.pipeline import Pipeline, get_settingstest_import_pipeline_processors(): 验证所有 processors 可导入test_import_pipeline_platforms(): 验证所有 platforms 可导入
整合验证命令
验证 metadata 整合:
# 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 整合:
# 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 可用:
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 迁移模式)