🎯 书籍学习协调技能 (Book Learning Coordinator Skill)
> **创建日期**: 2026-03-22
by buruqinshouburu · published 2026-04-01
$ claw add gh:buruqinshouburu/buruqinshouburu-reading-book# 🎯 书籍学习协调技能 (Book Learning Coordinator Skill)
> **创建日期**: 2026-03-22
> **版本**: 1.0
> **用途**: 协调管理书籍学习的完整流程,控制各模块顺序执行
> **标签**: #流程管理 #学习协调 #进度跟踪
---
🎯 核心职责
作为总控模块,协调book-extractor、note-generator、neo4j-cypher-generator、neo4j-importer四个子模块的执行顺序,管理学习进度,处理异常情况,生成学习总结报告。
---
📋 完整学习流程
flowchart TB
A[开始学习] --> B[接收书籍路径]
B --> C[初始化学习环境]
C --> D[调用 book-extractor]
D --> E{章节提取成功?}
E -->|否 | X[终止并报告错误]
E -->|是 | F[创建笔记目录]
F --> G[初始化进度文件]
G --> H[遍历章节列表]
H --> I[调用 note-generator]
I --> J[调用 neo4j-cypher-generator]
J --> K[调用 neo4j-importer]
K --> L[更新进度文件]
L --> M{还有章节?}
M -->|是 | H
M -->|否 | N[生成全书总结报告]
N --> O[学习完成]
style A fill:#e1f5fe
style D fill:#e8f5e9
style I fill:#fff3e0
style J fill:#f3e5f5
style K fill:#fce4ec
style O fill:#c8e6c9---
🔧 执行步骤
Step 1: 初始化学习环境
**输入验证**:
def validate_input(book_path):
"""
验证书籍路径
"""
path_pattern = r"F:\\book\\(.+)\\\.docx"
if not re.match(path_pattern, book_path):
raise ValueError(f"Invalid path format. Expected: F:\\book\\<book>\\<book>.docx")
if not os.path.exists(book_path):
raise FileNotFoundError(f"Book file not found: {book_path}")
return True**提取书名**:
def extract_book_title(book_path):
"""
从路径提取书名
F:\book\Security Analysis\Security Analysis.docx -> Security Analysis
"""
import os
book_name = os.path.basename(os.path.dirname(book_path))
return book_name**创建笔记目录**:
$notePath = "F:\Obsidian\<书名>"
if (-not (Test-Path $notePath)) {
New-Item -ItemType Directory -Path $notePath -Force
Write-Output "Created: $notePath"
}---
Step 2: 初始化进度跟踪文件
**进度文件路径**: `F:\Obsidian\<书名>\学习进度跟踪.md`
**进度文件模板**:
# 《书名》学习进度
- **开始日期**: YYYY-MM-DD
- **总章节数**: XX 章
- **已完成**: 0/XX
- **状态**: 📖 进行中
## 章节进度
| 章节 | 标题 | 笔记文件 | Neo4j概念数 | Neo4j关系数 | 状态 | 完成时间 |
|------|------|---------|------------|------------|------|---------|
| Ch 1 | 标题 | Ch01-*.md | 0 | 0 | ⏳ | - |
| Ch 2 | 标题 | Ch02-*.md | 0 | 0 | ⏳ | - |
| ... | ... | ... | ... | ... | ... | ... |
## 执行日志
| 时间 | 章节 | 操作 | 结果 |
|------|------|------|------|
| YYYY-MM-DD HH:MM | - | 初始化 | ✅ 成功 |---
Step 3: 调用 book-extractor
**执行指令**:
请调用 book-extractor 模块,提取书籍的所有章节内容。
输入参数:
- 书籍路径: <book_path>**接收输出**:
{
"book_info": {
"title": "Security Analysis",
"path": "F:\\book\\Security Analysis\\Security Analysis.docx",
"total_chapters": 40
},
"chapters": [
{
"chapter": 1,
"title": "Security Analysis: Scope and Limitations",
"paragraphs": [...]
},
...
]
}**处理逻辑**:
---
Step 4: 逐章学习循环
**循环执行流程**:
def process_chapter(chapter_data, book_title, book_info):
"""
处理单个章节的完整学习流程
"""
chapter_num = chapter_data['chapter']
chapter_title = chapter_data['title']
# 4.1 调用 note-generator
note_result = invoke_note_generator({
"chapter": chapter_num,
"title": chapter_title,
"book_title": book_title,
"book_version": book_info.get('version', ''),
"author": book_info.get('author', ''),
"paragraphs": chapter_data['paragraphs']
})
if not note_result['success']:
return {
"chapter": chapter_num,
"success": False,
"error": "Note generation failed",
"details": note_result.get('error')
}
# 4.2 调用 neo4j-cypher-generator
cypher_result = invoke_cypher_generator({
"book_title": book_title,
"chapter": chapter_num,
"concepts": note_result['concepts'],
"relationships": note_result['relationships']
})
if not cypher_result['success']:
return {
"chapter": chapter_num,
"success": False,
"error": "Cypher generation failed",
"details": cypher_result.get('error')
}
# 4.3 调用 neo4j-importer
import_result = invoke_neo4j_importer({
"book_title": book_title,
"chapter": chapter_num,
"batches": cypher_result['batches'],
"total_batches": cypher_result['total_batches'],
"total_concepts": cypher_result['total_concepts'],
"total_relationships": cypher_result['total_relationships']
})
# 4.4 更新进度文件
update_progress_file(chapter_num, {
"note_file": note_result['note_file'],
"concepts_count": import_result.get('imported_concepts', 0),
"relationships_count": import_result.get('imported_relationships', 0),
"status": "✅" if import_result['overall_success'] else "❌",
"completed_at": datetime.now().strftime("%Y-%m-%d %H:%M")
})
return {
"chapter": chapter_num,
"success": import_result['overall_success'],
"note_file": note_result['note_file'],
"concepts_count": import_result.get('imported_concepts', 0),
"relationships_count": import_result.get('imported_relationships', 0)
}---
Step 5: 异常处理
**异常分类处理**:
| 异常类型 | 章节级别处理 | 全局处理 |
|---------|-------------|---------|
| **book-extractor失败** | N/A | 终止整个流程,报告错误 |
| **note-generator失败** | 记录错误,跳过当前章节 | 继续下一章节 |
| **cypher-generator失败** | 记录错误,跳过当前章节 | 继续下一章节 |
| **neo4j-importer失败** | 记录错误,跳过当前章节 | 继续下一章节 |
**错误记录格式**:
## 错误日志
| 时间 | 章节 | 模块 | 错误信息 |
|------|------|------|---------|
| YYYY-MM-DD HH:MM | Ch 5 | note-generator | 概念提取失败: 内容为空 |
| YYYY-MM-DD HH:MM | Ch 12 | neo4j-importer | 连接超时 |---
Step 6: 全书总结
当所有章节处理完成后,调用note-generator的**全书总结模式**:
**输入参数**:
{
"mode": "full_book_summary",
"book_title": "Security Analysis",
"book_version": "6th Edition",
"author": "Benjamin Graham",
"total_chapters": 40,
"completed_chapters": 38,
"failed_chapters": 2,
"note_files": [
"F:\\Obsidian\\Security Analysis\\Ch01-*.md",
"F:\\Obsidian\\Security Analysis\\Ch02-*.md",
...
],
"total_concepts": 150,
"total_relationships": 80,
"start_date": "2026-03-22",
"end_date": "2026-03-25"
}**生成报告**: `F:\Obsidian\<书名>\全书学习完成报告.md`
---
📊 学习统计报告
**生成最终统计**:
## 📊 学习完成统计
| 指标 | 数值 |
|------|------|
| **书籍名称** | Security Analysis |
| **作者** | Benjamin Graham |
| **学习日期** | 2026-03-22 ~ 2026-03-25 |
| **总章节数** | 40 |
| **成功完成** | 38 (95%) |
| **失败跳过** | 2 (5%) |
| **笔记文件** | 38 个 |
| **Neo4j概念** | 150 个 |
| **Neo4j关系** | 80 个 |
| **总耗时** | ~8 小时 |---
🔄 子模块调用接口
1. book-extractor 调用
def invoke_book_extractor(book_path):
"""
调用书籍章节提取模块
"""
# 指令:调用 book-extractor 模块
# 输入:book_path
# 输出:章节列表
pass2. note-generator 调用
def invoke_note_generator(chapter_data):
"""
调用笔记生成模块
"""
# 指令:调用 note-generator 模块
# 输入:章节内容 + 书籍信息
# 输出:Markdown笔记 + 概念列表
pass3. neo4j-cypher-generator 调用
def invoke_cypher_generator(concepts_data):
"""
调用Cypher生成模块
"""
# 指令:调用 neo4j-cypher-generator 模块
# 输入:概念列表 + 关系列表
# 输出:批次化Cypher语句
pass4. neo4j-importer 调用
def invoke_neo4j_importer(batches_data):
"""
调用Neo4j导入模块
"""
# 指令:调用 neo4j-importer 模块
# 输入:批次列表
# 输出:执行报告
pass---
✅ 质量检查清单
初始化阶段
执行阶段
总结阶段
---
🎓 使用示例
**输入**:
请开始学习书籍:F:\book\Security Analysis\Security Analysis.docx**执行流程**:
1. 验证路径: ✅ F:\book\Security Analysis\Security Analysis.docx
2. 提取书名: Security Analysis
3. 创建笔记目录: F:\Obsidian\Security Analysis\
4. 初始化进度文件: ✅
5. 调用 book-extractor:
- 提取到 40 个章节
6. 逐章处理:
- Ch 1: note-generator → cypher-generator → neo4j-importer ✅
- Ch 2: note-generator → cypher-generator → neo4j-importer ✅
- ...
- Ch 40: note-generator → cypher-generator → neo4j-importer ✅
7. 生成全书总结报告: ✅
8. 输出最终统计**输出**:
{
"success": true,
"book_title": "Security Analysis",
"total_chapters": 40,
"completed_chapters": 40,
"failed_chapters": 0,
"note_files": 40,
"total_concepts": 150,
"total_relationships": 80,
"duration": "8 hours",
"summary_file": "F:\\Obsidian\\Security Analysis\\全书学习完成报告.md",
"progress_file": "F:\\Obsidian\\Security Analysis\\学习进度跟踪.md"
}---
🚀 高级功能
断点续学
**从指定章节继续**:
def resume_from_chapter(chapter_num):
"""
从指定章节继续学习
"""
# 读取进度文件
progress = read_progress_file()
# 跳过已完成章节
for chapter in progress['completed']:
continue
# 从指定章节开始处理
for chapter in chapters[chapter_num-1:]:
process_chapter(chapter, book_title, book_info)批量处理
**一次处理多本书籍**:
def process_multiple_books(book_paths):
"""
批量处理多本书籍
"""
results = []
for path in book_paths:
result = process_book(path)
results.append(result)
return results---
🔄 模块依赖关系
book-learning-coordinator (总控)
├── book-extractor (章节提取)
├── note-generator (笔记生成)
├── neo4j-cypher-generator (Cypher生成)
└── neo4j-importer (Neo4j导入)---
⚠️ 注意事项
1. **执行顺序**: 必须严格按照 book-extractor → note-generator → neo4j-cypher-generator → neo4j-importer 的顺序
2. **错误隔离**: 单个章节失败不应影响其他章节
3. **进度持久化**: 每完成一个章节必须更新进度文件
4. **资源管理**: 确保文件句柄和连接正确关闭
---
📝 进度文件更新逻辑
def update_progress_file(chapter_num, data):
"""
更新进度文件中的章节状态
"""
# 读取现有进度文件
progress_content = read_file("F:\\Obsidian\\<书名>\\学习进度跟踪.md")
# 更新对应章节行
# 替换: | Ch 1 | ... | ⏳ | - |
# 为: | Ch 1 | ... | ✅ | 2026-03-22 18:30 |
# 更新完成计数
# 替换: - **已完成**: 0/XX
# 为: - **已完成**: 1/XX
# 添加执行日志
# | YYYY-MM-DD HH:MM | Ch 1 | 章节学习 | ✅ 完成 (3概念, 2关系) |
# 保存更新后的文件
write_file("F:\\Obsidian\\<书名>\\学习进度跟踪.md", progress_content)---
🛠️ OpenClaw 脚本配置
**脚本文件**: `book-learning-coordinator-script.py`
**脚本类型**: Python
**调用方式**: 外部工具
**角色**: 流程协调器,依赖其他4个子模块脚本
执行命令
python book-learning-coordinator-script.py --book_path "<书籍路径>" [--resume] [--start_chapter N]输入参数
{
"book_path": "F:\\book\\Security Analysis\\Security Analysis.docx",
"resume": false,
"start_chapter": null,
"neo4j_config": {
"uri": "http://localhost:7474",
"user": "neo4j",
"password": "your_password"
}
}输出格式
{
"success": true,
"book_title": "Security Analysis",
"total_chapters": 40,
"completed_chapters": 40,
"failed_chapters": 0,
"note_files": 40,
"total_concepts": 150,
"total_relationships": 80,
"duration": "8 hours",
"summary_file": "F:\\Obsidian\\Security Analysis\\全书学习完成报告.md",
"progress_file": "F:\\Obsidian\\Security Analysis\\学习进度跟踪.md",
"execution_log": [
{
"timestamp": "2026-03-22T18:30:00Z",
"chapter": 1,
"status": "completed",
"concepts": 3,
"relationships": 2
}
]
}OpenClaw 调用逻辑
#### 完整流程
1. **初始化阶段**
- 验证书籍路径存在
- 提取书名(从文件名)
- 创建笔记目录
- 初始化进度文件
2. **章节提取阶段**
- 调用 `book-extractor-script.py`
- 获取章节列表
- 验证提取结果
3. **逐章处理阶段**
- 循环处理每个章节
- 按顺序调用3个子模块脚本
- 每完成一章更新进度
- 错误处理和日志记录
4. **总结阶段**
- 生成全书总结报告
- 输出最终统计
- 标注错误章节
#### 子模块调用序列
book-learning-coordinator
└─→ book-extractor-script.py
└─→ for each chapter:
├─→ note-generator-script.py
│ └─→ neo4j-cypher-generator-script.py
│ └─→ neo4j-importer-script.py
└─→ update progress file特殊模式
#### 断点续学模式
python book-learning-coordinator-script.py --resume --book_path "F:\book\...\book.docx"#### 指定章节开始
python book-learning-coordinator-script.py --start_chapter 15 --book_path "F:\book\...\book.docx"错误处理
进度监控
协调器会实时更新进度文件,用户可通过以下方式查看进度:
1. 查看 `学习进度跟踪.md` 文件
2. 执行日志输出到控制台
3. 错误日志单独记录
---
_Book Learning Coordinator v1.0 · 2026-03-22_ 🎯
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...