Skip to content
Back to skills

lazy-english-reader

ASecurity

Use when the user wants to process a whole book file (PDF, EPUB, MOBI, DOCX, or TXT) into any of — a full Chinese translation, chapter-by-chapter intensive reading notes (第一人称中文复述 + 嵌入式精译 + 编辑解读), an Obsidian reading vault, or cross-chapter theme notes. Trigger even when the user only mentions one of these (translation, reading notes, vault, 主题归纳) — the skill treats them as three independent products (全本翻译 / 章节精读 / 主题归纳) and only runs what's asked. Common trigger phrases include "translate th...

  • 3 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 19, 2026
ai-agentspythonshellbashgit

Works with

  • claude code
  • cli

Security analysis

A96/100
  • mediumInstalls packages at runtime which could introduce malicious dependencies

Pro scans all 20 files and shows the line behind each finding

Scanned September 19, 2026

npx -y skills add designservice/lazy-english-reader.skill --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of lazy-english-reader?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for lazy-english-reader
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/designservice-lazy-english-reader/badge)](https://www.skillsdirectory.com/skills/designservice-lazy-english-reader)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: lazy-english-reader
description: Use when the user wants to process a whole book file (PDF, EPUB, MOBI, DOCX, or TXT) into any of — a full Chinese translation, chapter-by-chapter intensive reading notes (第一人称中文复述 + 嵌入式精译 + 编辑解读), an Obsidian reading vault, or cross-chapter theme notes. Trigger even when the user only mentions one of these (translation, reading notes, vault, 主题归纳) — the skill treats them as three independent products (全本翻译 / 章节精读 / 主题归纳) and only runs what's asked. Common trigger phrases include "translate this book", "read this book for me", "make reading notes", "整本翻译", "帮我读这本书", "做精读笔记", "整理到 Obsidian", "读这本英文书".
---

# Lazy English Reader Skill

整书学习工作流。它把 PDF/EPUB/MOBI/DOCX/TXT 拆成三个独立可选的产物:**全本翻译**、**章节精读**、**主题归纳**,外加 Obsidian vault 集成。三个产物可单独跑也可组合跑。

本 skill 是 agent-agnostic 的。文档里出现的 `Read`、`Write`、`Bash`、`Agent`、`AskUserQuestion` 等名称只是能力示例;非 Claude Code 环境映射到等价工具即可。

**起点参考**:
- 全本翻译流水线脚本:[deusyu/translate-book](https://github.com/deusyu/translate-book) (MIT)
- 章节提取脚本:[hijiangtao/book-reader-skill](https://github.com/hijiangtao/book-reader-skill)
- Obsidian vault 架构方法论:[alchaincyf/obsidian-ai-orange-book](https://github.com/alchaincyf/obsidian-ai-orange-book)

## 三个产物

| | **全本翻译** | **章节精读** | **主题归纳** |
|---|---|---|---|
| 目的 | 整本中译,备查 | 主动学习与吸收 | 全书读完后的横向抽取 |
| 工具 | Calibre + Pandoc + 并行 worker | extract_book.py + 笔记编排 | 扫描章节笔记 + Obsidian 双链 |
| 产物 | epub / pdf / docx / md | 每章一份 markdown:第一人称叙事 + 嵌入式精译 + 编辑解读 | 方法论、人物、概念等主题笔记 |
| 依赖 | `ebook-convert` `pandoc` | 仅 Python 解析库 | 章节精读完成后的章节笔记 |

## 核心原则:single source of truth — 全本翻译和章节精读必须按同一份切分对齐

**这是 skill 最重要的设计原则。** 因为全本翻译和章节精读会**互相 wikilink**(章节精读里的"原文 → 中译"链接、全本翻译入口里的"→ 精读笔记"链接),两条线的章节划分必须 1:1 对齐——同章号、同文件名、同粒度。

**权威是 `.chapter_map.json`**,在 Phase 3 生成:

```json
{
  "chapters": [
    {"num": 0, "filename": "第00章_引言_Foreword_Introduction",
     "anchors": []},
    {"num": 1, "filename": "第01章_谁建了金字塔_Who_Built_the_Pyramids",
     "anchors": ["序言 I", "PREFACE I", "MIKE LEFEVRE"]},
    ...
  ]
}
```

- **章节精读** 用 chapter_map 决定写哪些章节笔记,文件名直接取 `chapters[i].filename`
- **全本翻译** 的 postprocess 用 `--chapter-map` 参数驱动切分,文件名也用 `chapters[i].filename`
- 结果:`00_全本中译/第04章_耕地谋生_Working_the_Land.md` 和 `01_章节精读/第04章_耕地谋生_Working_the_Land.md` **同名只是不同文件夹**

**反 pattern(不要做)**:
- ❌ 章节精读按"工种类别"切 29 篇,全本翻译按 EPUB 自带 chapter 切 14 篇——映射不上
- ❌ 全本翻译按 markdown 标题 `#` `##` 切——翻译过程会把 section 标题降级为段落,导致前言被堆成一个巨型文件
- ❌ "两条线粒度不一致没关系"——必然导致 cross-link 错位

**为什么 chapter_map 是权威**:它在 EPUB 解出的英文纯文本上用 ALL-CAPS 启发式建立,**翻译之前**就确定。翻译过程对它不可见,所以不会污染。

## 工作流总览

```
Phase 0  收集参数(交互)
Phase 1  环境检查 + vault 准备
Phase 2  全本翻译启动(如选)→ 后台跑
Phase 3  章节结构提取结构 → 生成 MOC + 章节地图
Phase 4  章节循环(前台,按用户节奏)
Phase 5  主题归纳(章节精读全部完成后)
Phase 6  全本翻译完成后挂进 vault
Phase 7  最终报告
```

## Agent 能力映射

执行时只需要:读写文件、运行 shell、搜索文件、向用户收集参数、必要时并行或后台处理 chunk。若平台没有并行 worker,全本翻译可以顺序执行,只是更慢;若没有结构化提问工具,就先让用户提供配置,再写入 `.lazy-english-reader.json`。

**`{baseDir}` 表示这个 skill 的安装目录**——Claude Code 下通常是 `~/.claude/skills/lazy-english-reader/`,其他 agent 请替换成本地实际路径。详细的能力名 → 平台工具映射见 `references/agent_adapter.md`。

## Phase 0 — 收集参数

一次问完以下参数。在 Claude Code 里可用 `AskUserQuestion`;其他 agent 可用自然语言追问、表单、配置文件或等价的用户输入机制。

1. **书的路径**(必填)
2. **跑哪些产物**:只做全本翻译 / 只做章节精读 / **全本翻译 + 章节精读(推荐,主题归纳会在章节精读完成后自动跑)** / 只重跑主题归纳
3. **目标语言**:默认 `zh`
4. **Obsidian vault 路径**:默认 `~/Documents/Obsidian/Vault`
5. **书的笔记目录名**:按 **`<原书主标题>-<作者姓>`** 命名规则推断。规则:
   - 用原书主标题(去掉副标题如 `: Researching, Interviewing, Writing`,去掉冠词 `The/A`,但 `The` 是书名核心一部分时保留)
   - 用 `-` 连接作者姓(last name 或中文姓)
   - 原书是英文 → 用英文(`Moby-Dick-Melville`、`War-and-Peace-Tolstoy`)
   - 原书是中文 → 用中文(`活着-余华`、`人类简史-Harari`)
   - 多字标题用下划线或保留空格替成 `-`(`Brothers-Karamazov-Dostoyevsky`)
6. **章节笔记体量**(不卡死,给 AI 一个参考量级):
   - **单人章节**(一篇前言 / 一位采访对象):1500–2500 字中文
   - **多人章节**(3–6 位口述者):3000–6000 字中文
   - **巨型多人章节**(10+ 位口述者,如 某口述史经典的13 人):主推 5–6 位主角,其他人在编辑解读里整合,不要硬把每个人拉成同等长度
   - **跟原书章节差不多长**(用户想要逐句中文复述):选这个时跳过"嵌入式精译",整章直接当翻译做
7. **全本翻译并行度**:默认 8

把参数写入 `<vault>/书库/<book_dir>/.lazy-english-reader.json` 作为本次 run 的配置档。兼容旧项目时,如果只发现 `.book-workflow.json`,先读取旧文件,再在下次保存时迁移到新文件名。

## Phase 1 — 环境检查 + vault 准备

```bash
python3 --version
which ebook-convert pandoc   # 全本翻译才需要
python3 -m pip install -r {baseDir}/requirements.txt
```

vault 骨架(**仅 vault 不存在时建**,不要覆盖用户已有内容):

```
<vault>/
├── CLAUDE.md            ← 用 templates/vault_CLAUDE.md(AI context file)
├── index.md             ← 用 templates/vault_index.md
├── 书库/
│   └── <book_dir>/
│       ├── CLAUDE.md    ← 用 templates/book_CLAUDE.md(AI context file)
│       ├── index.md     ← 用 templates/book_index.md
│       ├── 00_全本中译/
│       ├── 01_章节精读/
│       └── 02_主题笔记/
└── 主题/
```

> **重要**:vault 根**不要**自动建 `日记/`、`灵感/`、`项目/` 之类,除非用户明确要做综合性第二大脑。本 skill 默认 vault 是读书笔记专用。

## Phase 2 — 全本翻译启动(后台)

如果用户选了全本翻译:

```bash
mkdir -p <vault>/书库/<book_dir>/00_全本中译/
cd <vault>/书库/<book_dir>/00_全本中译/
python3 {baseDir}/scripts/convert.py "<book_path>" --olang "<target_lang>"
```

之后按全本翻译的 7 步流程(与原 translate-book 一致):discover chunks → build glossary → parallel worker translate → merge meta per batch → verify → translate title → merge_and_build。

**全本翻译可以后台跑**。Claude Code 可用 `Bash run_in_background=true`;其他环境用后台 shell、任务队列或独立 worker。用户同时要全本翻译和章节精读时,先启动全本翻译再进 Phase 3——这样翻译在后台跑的同时用户可以读章节精读。

> 注:78+ chunks 时建议让全本翻译跑独立长任务,不要在主对话里逐个创建 worker —— 会爆 context。可考虑:
> 1. 写一个独立 shell 脚本调用 claude CLI 顺序翻译,后台 nohup 起
> 2. 或让一个 dispatching worker 内部并行

### 启动同时必须写 HANDOFF.md(防止"翻译跑完没人接")

后台翻译可能跑 30 min – 2 小时,期间主对话可能完全结束、用户关电脑、几小时后才回来。**启动翻译的同一刻必须立刻**做两件事:

**1. 写 `<vault>/书库/<book_dir>/HANDOFF.md`**,内容样板:

```markdown
# 全本翻译后台任务

- **PID**:`<pid>`(也写到 `/tmp/<book_dir>-translate/translate.pid`)
- **日志**:`/tmp/<book_dir>-translate/translate.log`
- **temp 目录**:`/tmp/<book_dir>-translate/<book_filename>_temp/`
- **预计时间**:30 min – 2 小时
- **完成标记**:当 `<temp_dir>/_DONE` 文件出现时,翻译完成

## 翻译完成后必须运行(Phase 6)

```bash
python3 ~/.claude/skills/lazy-english-reader/scripts/postprocess_book.py \
  "<temp_dir>" \
  "<vault>/书库/<book_dir>/00_全本中译" \
  --title "<中文书名>" \
  --author "<作者>"
```

## 进度检查(任何时候都能跑)

```bash
tail -3 <log_path>
ls <temp_dir>/output_chunk*.md 2>/dev/null | wc -l   # 已完成的 chunk 数
test -f <temp_dir>/_DONE && echo "✅ 翻译完成,可以跑 postprocess" || echo "⏳ 还在跑"
```
```

**2. 让后台脚本在结束时 `touch <temp_dir>/_DONE`**——`scripts/convert.py` 或 `merge_and_build.py` 的最后一行加上 `Path(temp_dir / "_DONE").touch()`。这是主对话 / 用户检查是否完成的唯一可靠信号(不要用日志最后一行匹配,会被部分写入糊弄)。

**3. 重入检查**:每次用户重新触发 `lazy-english-reader`,主对话第一件事是检查 `HANDOFF.md` 是否存在、`_DONE` 是否出现——出现就直接跳到 Phase 6。

具体术语表 / merge / build 细节见原 [translate-book SKILL.md](https://github.com/deusyu/translate-book/blob/main/SKILL.md)。

## Phase 3 — 提取章节结构

```bash
python3 {baseDir}/scripts/extract_book.py "<book_path>" \
    -o "<vault>/书库/<book_dir>/.extracted.json"
```

读 JSON 输出,做章节分组:

- **PDF**:优先用 PDF 自带 outline (`fitz.open(...).get_toc()`)。如果没 outline,再用 metadata + 目录页 fallback
- **EPUB/MOBI**:默认按 EPUB 自带的 chapter 划分。**但要做 anthology 检测**——见下
- **TXT**:按章节标记或固定行数

### EPUB anthology 检测(口述史 / 短篇集 / 散文集必做)

很多书 EPUB 文件里的 "chapter" 其实是**编辑分组**,真正的读单元更细。典型例子:

- 某口述史经典:某 EPUB chapter 内含 13 位工人独白,每位工人才是真正的读单元
- 散文集:一个 EPUB chapter 包含多篇散文
- 短篇集:一个 EPUB chapter = 一本子集,下面才是单篇

**检测**:

```python
# Phase 3 提取完后,对 EPUB / MOBI 检查每个 chapter 的内部结构
for chapter in extracted_chapters:
    body = chapter['text']
    # 找全大写或 markdown-style 内嵌标题
    allcaps_sections = re.findall(r'^[A-Z][A-Z0-9 ,\'\-]{4,}$', body, re.MULTILINE)
    bold_sections = re.findall(r'^\*\*[A-Z][^*]+\*\*$', body, re.MULTILINE)
    if len(allcaps_sections) + len(bold_sections) >= 3:
        # 这个 EPUB chapter 是 anthology,按内部 section 重切
        flag_for_resplit(chapter)
```

**处理**:检测到 anthology 后,**章节笔记单元改成 section(或 worker / 篇)而不是 EPUB chapter**。文件命名仍按阅读顺序数字前缀 `第NN章_<slug>.md`,但"章"现在指的是真正的读单元——可能比 EPUB 自带的 chapter 多很多(某口述史经典 EPUB 有 ~9 个 chapter,重切后有 29 个真正的读单元 / section)。

**这件事章节精读和全本翻译都要按同一份结构走** —— 见上面的「核心原则」。
重切后产出 `.chapter_map.json`,**章节精读用它写笔记,全本翻译 postprocess 用它切中译**,两条线产出的 markdown 同名。

### 生成 `.chapter_map.json`

```python
# Phase 3 末尾
chapter_map = {
    "chapters": [
        {"num": i, "filename": f"第{i:02d}章_{中文slug}_{english_slug}",
         "anchors": [list_of_anchor_strings_for_this_chapter]}
        for i, ch in enumerate(real_reading_units)
    ]
}
Path(book_dir / '.chapter_map.json').write_text(json.dumps(chapter_map, ensure_ascii=False, indent=2))
```

**anchors 是什么**:每章起点的「候选字符串列表」,按优先级排序——脚本对每个候选在合并 markdown 里找 H1/H2 标题,第一个找到的就是该章起始行。**工人英文名 / 篇章作者英文名是最稳的锚点**(翻译会保留)。section 中文标题(如 "前言" "引言")可以作为备选,但常被翻译降级为段落,作可选 anchor 但不要只放这一个。

产出 `01_章节精读/00_章节地图.md`:

```markdown
# 章节地图 — <书名>

| # | 章节 | 英文标题 | 页 | 状态 | 链接 |
|---|------|---------|----|------|------|
| 0 | 引言 | Introduction | 1–12 | ⬜ | [[第00章_Introduction]] |
| 1 | ... | ... | ... | ⬜ | [[第01章_xxx]] |
```

**不再创建每章子目录**。章节笔记本身将在 Phase 4 直接作为平铺单文件创建,文件名格式 `第NN章_<英文 slug>.md`。

## Phase 4 — 章节循环

**核心规范**:

```
01_章节精读/
├── 00_章节地图.md
├── 第00章_Introduction.md     ← 一章一文件,平铺
├── 第01章_xxx.md
├── ...
```

每章一个 markdown,**单文档**,结构如下:

```markdown
---
book: "<书名 — 作者>"
chapter: N
chapter_title: "中文标题 / 英文标题"
pages: [start, end]
status: draft | done
voice: 第一人称(作者自述,中文复述)
tags: [...]
created: YYYY-MM-DD
---

# 第 N 章 — 中文章名 / English Title

## [具体物件/场景小标题 1]

[第一人称中文叙述]

> 中文译文(关键的一两句,作者本人有强语气 / 动作 / 细节的瞬间)
> *English original here* (p.XX)

[继续叙述]

## [小标题 2]
...

---

## 编辑解读

> 笔记整理者(非作者)的几条说明,**描述书中内容/补充背景**,不评论作者技巧。

**关于 XXX。** ...

**关于 XXX。** ...

---

## 我的批注

<!-- HUMAN -->

<!-- /HUMAN -->

---

## 链接

- ↑ [[00_章节地图]]
- ← 上一章:[[第NN章_xxx]]
- → 下一章:[[第NN章_xxx]]
- 关联主题:[[../02_主题笔记/...]](待写)
```

### 章节 vs 部分(重要区分)

> PDF outline 里 part 扉页 vs 真章节怎么区分、文件命名 `第N部_xxx.md` / `第NN章_xxx.md` 怎么排前缀、全本翻译/章节精读 怎么镜像——详细规则和 *War and Peace* 等典型例子见 `references/chapters_vs_parts.md`。处理 PDF outline 出现 L1/L2 混合时必读。

### Book 目录入口 = book root index.md(不要在 00_全本中译/ 里再加 index)

每本书的入口是 **`书库/<book_dir>/index.md`**,不在 `00_全本中译/` 再起一个 index。这一个文件包含:

- 章节表(按 part 分组,每行:中文译本链接 + 精读笔记链接)
- 中文版下载(epub/pdf/docx 链接到 `00_全本中译/其他格式/`)
- 主题笔记链接(主题归纳产物)
- 术语表链接
- 元信息

`01_章节精读/00_章节地图.md` 仍然保留——它是章节进度追踪表,可以在 book root index 里链过去。

### 写作风格规范(写每一章都必须遵守)

> 写每一章前先读 `references/writing_style.md` —— 全部强制规则(第一人称、小标题取自具体物件而非"核心内容/主要论点"、**中文 primary 英文小字辅助**、跨文化抽象词必须 inline gloss、编辑解读边界、不写元说明等)。这些规则不遵守会让笔记直接变成"读书报告体",丧失这个 skill 的核心价值。

> **多人多视角章节**(一个"章"下面有 3+ 位口述者 / 人物 / 案例,如 某口述史经典 的汽车业 13 人):另外读 `references/multi_worker_chapter.md` 用专门的模板(H2 = 人物 + H3 = 物件 / 动作小标题 + 章末统一编辑解读)。

### 循环节奏(强制使用 subagent 派发)

**为什么必须 subagent**:每章笔记 3000–6000 字中文 + 嵌入式精译 + 读源章节,光做一章主对话就要消耗 10K+ tokens。30 章的书在主对话里直接做,主对话上下文撑不到 10 章就会枯竭——AI 会自己说"context 快不够了"然后停下。这个 skill 在真实测试中**只靠运气拐回 subagent 模式才完成**。新跑必须从第 2 章开始就强制走 subagent。

**节奏**:

1. **第 1 章**:主对话直接做(Read 源章节 + Write 章节笔记)。**做完停下来**——给用户看风格样本,等用户确认 / 反馈。这一章是风格基准,反馈很关键。
2. **第 2 章起**:每章一个 `Agent` 子任务,**主对话只调度不读章节内容**。每个 subagent 拿到的 prompt 必须自包含,含:
   - 源章节文件路径(agent 自己去读)
   - `{baseDir}/references/writing_style.md`(写作 9 条规则)
   - `{baseDir}/references/multi_worker_chapter.md`(多人多视角章节模板,如适用)
   - 章节元数据(章号、英文标题、中文标题、页码范围)
   - 输出路径(`01_章节精读/NN_第XX章_xxx.md`)
   - 上 / 下一章的文件名(用于双链)
   - 第 1 章作为风格样本的文件路径(让 subagent 对照风格)
3. **并行度**:一次 8–10 个 subagent 并行。每批完成后更新 `00_章节地图.md`,向用户汇报 N 章 ✅,征求继续 / 改风格 / 暂停。
4. **从第 1 章主对话 → 第 2 章 subagent 是硬切换**。不要"第 2 章再主对话试一下"——主对话每多做一章,剩余 budget 就少一截。

**收益**:用户实测 某口述史经典(29 章)— 前 9 章主对话直接做几乎耗尽主对话 context,后 20 章 + 7 篇主题笔记换成 subagent 并行派发,主对话 context 节省 ≥70%。

## Phase 5 — 主题归纳

章节精读全部完成后,扫描所有章节精读文件的"编辑解读"和小标题,识别反复出现的主题,为每个主题产出一份笔记到 `02_主题笔记/`:

```
02_主题笔记/
├── index.md
├── 方法论_xxx.md
├── 人物_xxx.md
```

每份主题笔记:
- 跨章节聚合相关段落(双链回章节)
- 提炼 3-5 条原则/金句
- 链到 `<vault>/主题/` 下的跨书概念笔记(如果存在)

同时更新 `<vault>/主题/` 跨书笔记。

## Phase 6 — 全本翻译完成后挂进 vault

**入口**:检查 `<temp_dir>/_DONE` 是否存在(见 Phase 2 的 HANDOFF 机制)。如果存在,立刻跑下面的命令;如果不存在,说明翻译还在跑,**不要尝试 postprocess**——会读到半成品。直接告诉用户"翻译还在跑,预计 X chunks 剩余"。

如果用户重新触发 skill 而当时翻译刚好跑完,主对话第一件事就是检查 `_DONE` → 跑 postprocess。**不要把这一步留给用户记得去手动跑**——这是上一版 skill 真实测试中翻译跑完没人接的根因。

```bash
python3 {baseDir}/scripts/postprocess_book.py \
    "<temp_dir>" \
    "<vault>/书库/<book_dir>/00_全本中译" \
    --title "<中文书名(不带《》)>" \
    --author "<作者>" \
    --chapter-map "<vault>/书库/<book_dir>/.chapter_map.json"
```

**`--chapter-map` 必传**(除非你确认这本书结构很简单且 markdown 标题不会丢)。它让全本翻译按 Phase 3 建立的 chapter_map 切,**与章节精读 1:1 对齐**(同名只是不同文件夹)。

如果没有 `.chapter_map.json` 又想跑(不建议),可以用 `--structure-json <path>/.structure.json` 让脚本退化到「每个 section 一章」。**最差不要不传任何 anchor 参数**——脚本会回退到按 `##` 切分的 legacy 模式,前言部分会塞成一个巨型文件(在结构复杂的口述史 / 散文集 / 短篇集上必坏)。

这个脚本做了:

1. 读 temp dir 的 `output.md`,**清洗伪方括号** `[文本]`(Calibre HTMLZ → markdown 的伪影),保留真链接和图片
2. **用 chapter_map 切分**(用工人英文名作 anchor,不依赖 markdown 标题层级——这些经常在翻译过程中失落),输出与章节精读同名的 markdown,**平铺**在 `00_全本中译/` 根
3. 把 temp dir 的 `images/` **挪到** `00_全本中译/其他格式/images/`
4. 复制 `glossary.json` 到 `00_全本中译/`
5. 复制 `templates/book-style.css` 到 `其他格式/book-style.css`
6. 用 PIL 自动**挑封面图**(第一张高 > 1000px 的竖版 JPG),用 pandoc 重新生成带封面 + 中文 CSS 的 epub
7. 用 ebook-convert 把 epub 转成 **A5 + 页码 + 自动目录 + 章节换页**的 PDF
8. 用 pandoc 生成带标题/作者/目录的 docx
9. 所有产物用**中文书名**命名(`<书名>.epub` / `.pdf` / `.docx` / `.md`),不用 `book.*`
10. 删除 temp dir(`--keep-temp` 可保留)

最终布局:

```
00_全本中译/
├── index.md            ← 由协调 agent 在 Phase 6 之后写
├── glossary.json
├── 第00章_xxx.md … 第NN章_xxx.md  ← 每章独立 markdown,**文件名与 01_章节精读/ 下完全相同**
└── 其他格式/
    ├── <书名>.epub
    ├── <书名>.pdf
    ├── <书名>.docx
    ├── <书名>.md       ← 合并后的完整 markdown
    ├── book-style.css
    └── images/         ← 原书图片
```

然后协调 agent 写 `00_全本中译/index.md`(用 Obsidian 双链列出所有章节 + `其他格式/` 入口),并在 book_dir 的 `index.md` 顶部加链接。

如果全本翻译失败:在 `00_全本中译/_FAILED.md` 写诊断信息。

## Phase 7 — 最终报告

向用户汇报,按状态分两种情况:

**Case A:所有产物完成**
- 全本翻译产物路径 + 大小
- 章节精读:N 章 ✅,Obsidian 路径,章节地图链接
- 主题归纳:M 篇主题笔记
- 下一步建议(在 Obsidian 读、批注、跨书互联)

**Case B:章节精读 + 主题归纳完成,全本翻译还在后台跑**

写一份 `<vault>/书库/<book_dir>/REPORT.md` 中期报告(不写 STDOUT 长汇报),结构:
- 已完成的产物(章节精读 + 主题归纳的细目)
- 全本翻译当前进度(X / Y chunks,预计还需 X 小时)
- 引用 `HANDOFF.md` 里的进度检查命令
- 写明:翻译完成后用户再触发一次 `lazy-english-reader`,主对话会自动检查 `_DONE` 并跑 Phase 6

这样用户关电脑去做别的事,几小时后回来重新触发 skill 就能无缝衔接。

## 断点续跑

每个 Phase 可中断重入。**用户重新触发 `lazy-english-reader` 时,主对话第一件事按此顺序检查**:

1. **`<vault>/书库/<book_dir>/HANDOFF.md` 是否存在** → 说明上次启动了后台翻译
   - 如果 `<temp_dir>/_DONE` 已出现 → 跳到 Phase 6 跑 postprocess
   - 如果 `_DONE` 没出现 → 给用户看进度,问"继续等 / 重启 / 杀掉"
2. **`.lazy-english-reader.json` 是否存在**(兼容读取旧的 `.book-workflow.json`) → 拿之前的参数,问用户"延用 / 改一下 / 推倒重来"
3. **`.extracted.json` 是否存在** → Phase 3 可跳过
4. **`01_章节精读/00_章节地图.md` 里 ✅ 状态字段** → Phase 4 只处理未完成的章
5. **`02_主题笔记/index.md` 是否存在** → Phase 5 可跳过

全本翻译自带 chunk-level resume(已有 `output_chunk*.md` 的 chunk 跳过),所以即使后台进程被杀,重启脚本会接上。

## 失败处理

> 各种错误恢复手册见 `references/troubleshooting.md`(Calibre 缺失、扫描版 PDF 要 OCR、chunk 翻译失败、temp/images 清理顺序、pandoc 重跑前备份等)。

## 附录

全本翻译 worker 的翻译 prompt 模板(复用 translate-book)+ 章节标题降级陷阱与对策 + `scripts/realign_headings.py` 设计草稿,全部见 `references/translate_prompt.md`。

**注意**:章节标题降级陷阱的根治方案现在已经在 `postprocess_book.py` 里实现(`--chapter-map` 用 anchor-based 切分绕过 markdown 标题层级依赖),不再需要 `realign_headings.py`。translate_prompt.md 里那个 "对策 2" 章节标题对齐方案,现在的实现路径就是 chapter_map.json + postprocess_book.py `--chapter-map`。

Files in this skill

  • AGENTS.md379 B
  • GEMINI.md379 B
  • SKILL.md24.4 KB
  • references/agent_adapter.md1016 B
  • references/chapters_vs_parts.md2 KB
  • references/multi_worker_chapter.md3.5 KB
  • references/translate_prompt.md1.7 KB
  • references/troubleshooting.md1020 B
  • references/writing_style.md4.8 KB
  • requirements.txt52 B
  • scripts/calibre_html_publish.py15 KB
  • scripts/convert.py28.7 KB
  • scripts/extract_book.py16.5 KB
  • scripts/glossary.py21.2 KB
  • scripts/manifest.py4.7 KB
  • scripts/merge_and_build.py38.3 KB
  • scripts/merge_meta.py42.8 KB
  • scripts/meta.py9.5 KB
  • scripts/postprocess_book.py16.2 KB
  • templates/book-style.css2.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…