#488 by GitHub stars
deusyu/translate-book
Translate books (PDF/DOCX/EPUB) into any language using parallel sub-agents. Converts input -> Markdown chunks -> translated chunks -> HTML/DOCX/EPUB/PDF.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +65 / −2 lines
Before Network or broad shell → After Network or broad shell
a663b1b4f1e6 → 8a2d71cba25c
+ 55
+ 56 Page-number lines are detected and dropped for PDF input only; EPUB and DOCX
+ 57 keep every standalone number (chapter, verse or exercise numbers). If an EPUB
+ 58 prints its page numbers as text and they show up in the chunks, delete the
+ 59 temp directory before translating and re-run with `--detect-page-numbers`.
+ 247 - 脚注:正文中的引用标记 `[^12]` 与行首的定义标记 `[^12]:` 原样保留,不要改编号、不要删除、不要移动位置,只翻译定义后面的注释文字;定义的续段保持行首四个空格的缩进
- 405 python3 {baseDir}/scripts/merge_and_build.py --temp-dir "<temp_dir>" --title "<translated_title>" --cleanup
+ 411 python3 {baseDir}/scripts/merge_and_build.py --temp-dir "<temp_dir>" --title "<translated_title>"
- 411 The `--cleanup` flag removes intermediate files (chunks, input.html, etc.) after a fully successful build. If the user asked to keep intermediates, omit `--cleanup`.
+ 417 Keep the intermediate files. The chunks, `manifest.json`, and `run_state.json`
+ 418 are what make spot fixes and selective re-translation possible after the build
+ 419 (see Step 9). Add `--cleanup` only when the user explicitly asks to delete
+ 420 intermediates, and tell them first that it permanently deletes `chunk*.md`,
+ 421 `output_chunk*.md`, `input.html`, and `input.md`: after that, fixing a single
+ 422 chunk means converting and translating the whole book again.
+ 440
+ 441 ### 9. Spot Fixes After the Build
+ 442
+ 443 If the user finds problems in a few places after the build, fix the affected
+ 444 chunks rather than `output.md`: whenever a chunk changes, the build re-merges
+ 445 `output.md` from the chunks and discards edits made there.
+ 446
+ 447 1. Find the chunk: search `<temp_dir>/output_chunk*.md` for the passage.
+ 448 2. Either edit `output_chunk<NNNN>.md` directly, or have it re-translated.
+ 449
+ 450 **Edit.** `record` stamps the chunk as matching the current source and
+ 451 glossary, so first check what the planner still expects from it:
+ 452
+ 453 ```bash
+ 454 python3 {baseDir}/scripts/run_state.py plan "<temp_dir>"
+ 455 ```
+ 456
+ 457 If chunk<NNNN> appears in `chunks[]` with action `translate`, recording
+ 458 would hide that. Handle it by reason:
+ 459
+ 460 - `glossary_term_hash_changed` (its `detail` lists the term ids) or
+ 461 `glossary_term_selection_changed`: bring those terms in line with
+ 462 `glossary.py print-terms-for-chunk "<temp_dir>" "chunk<NNNN>.md"` in the
+ 463 same edit.
+ 464 - `manifest_source_hash_changed`: the source chunk was edited after
+ 465 splitting. Re-run the Step 2 `convert.py` command first, leaving out
+ 466 page-number flags such as `--strip-page-numbers`: once chunks exist,
+ 467 those flags abort and suggest deleting the cached files or the whole
+ 468 temp dir, which would also delete the translations. Without them it
+ 469 keeps the existing chunks and writes their new hashes to
+ 470 `manifest.json`. Skip this and the merge stops with "Source changed
+ 471 since splitting" even after re-translating. Plan again: the chunk is
+ 472 then queued with `source_hash_changed_since_record`.
+ 473 - `source_hash_changed_since_record` or any other reason: re-translate the
+ 474 chunk instead of editing it.
+ 475
+ 476 Then record the edited output:
+ 477
+ 478 ```bash
+ 479 python3 {baseDir}/scripts/run_state.py record "<temp_dir>" chunk<NNNN>
+ 480 ```
+ 481
+ 482 **Re-translate.** Delete `output_chunk<NNNN>.md` and run Steps 3.7–4.5 again. The planner
+ 483 re-checks the whole book, so `translation_chunk_ids` can also list chunks
+ 484 the user did not mention, typically ones whose glossary terms changed after
+ 485 they were translated (`glossary_term_selection_changed` or
+ 486 `glossary_term_hash_changed` in the plan's `chunks[].reasons`). Translate
+ 487 only the chunks the user asked for; if the plan lists others, show the user
+ 488 those chunk ids with their reasons and ask before re-translating them.
+ 489 3. Re-run the Step 7 build command with the same flags. It re-merges because
+ 490 the chunk is newer than `output.md`, then regenerates the HTML and the other
+ 491 formats.
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → a663b1b4f1e6
No earlier version was observed for comparison.
Verified commit 8a2d71cba25c514bfa6b6d6191b1fe21c0fe3229
git clone --filter=blob:none --no-checkout https://github.com/deusyu/translate-book.git .hotskills/deusyu-translate-book && git -C .hotskills/deusyu-translate-book checkout --detach 8a2d71cba25c514bfa6b6d6191b1fe21c0fe3229
# Copy each selected skill directory from .hotskills/deusyu-translate-book into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/deusyu/translate-book.git .hotskills/deusyu-translate-book && git -C .hotskills/deusyu-translate-book checkout --detach 8a2d71cba25c514bfa6b6d6191b1fe21c0fe3229
# Copy each selected skill directory from .hotskills/deusyu-translate-book into .agents/skills/<skill-name>/Heat
8.2- Star growth, last 7 daysAhead of 98% of tracked repositories
- Star growth, last 24 hoursAhead of 98% of tracked repositories
- Rank movement, last 7 daysAhead of 93% of tracked repositories
- Commits, last 30 daysAhead of 73% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
How it works
translate-book
When your agent uses it
Translate books (PDF/DOCX/EPUB) into any language using parallel sub-agents. Converts input -> Markdown chunks -> translated chunks -> HTML/DOCX/EPUB/PDF.
What it loads into context
Frontmatter
114 tokensAlways available to the agent
SKILL.md
6,785 tokensWhen the skill is activated
Reference documents
21,139 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Workflow
Scripts executed separately
scripts/calibre_html_publish.pyscripts/chunk_context.pyscripts/convert.pyscripts/glossary.pyscripts/manifest.pyscripts/merge_and_build.pyscripts/merge_meta.pyscripts/meta.pyscripts/run_state.pytests/test_calibre_html_publish.pytests/test_chunk_context.pytests/test_convert.pytests/test_glossary.pytests/test_manifest.pytests/test_merge_and_build.pytests/test_merge_meta.pytests/test_meta.pytests/test_run_state.py
Files
.claude/commands/release.mddoc1,315 bytes.clawhubignoreasset118 bytes.github/FUNDING.ymlasset68 bytes.github/workflows/ci.ymlasset581 bytes.gitignoreasset455 bytesAGENTS.mddoc5,131 bytesCLAUDE.mddoc3,861 bytesLICENSEasset1,064 bytesREADME.mddoc25,577 bytesREADME.zh-CN.mddoc24,925 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesSKILL.mdcore27,461 bytesassets/poster/pages/poster-en.pageasset21,213 bytesassets/poster/pages/poster.pageasset21,389 bytesassets/poster/style.mddoc4,166 bytesassets/poster/translate-book-poster-en.jpgasset227,579 bytesassets/poster/translate-book-poster-en.pptdasset1,237 bytesassets/poster/translate-book-poster.jpgasset234,120 bytesassets/poster/translate-book-poster.pptdasset1,229 bytesscripts/calibre_html_publish.pyruns13,336 bytesscripts/chunk_context.pyruns3,897 bytesscripts/convert.pyruns60,151 bytesscripts/glossary.pyruns22,286 bytesscripts/manifest.pyruns5,943 bytesscripts/merge_and_build.pyruns45,226 bytesscripts/merge_meta.pyruns43,840 bytesscripts/meta.pyruns9,720 bytesscripts/run_state.pyruns12,734 bytesscripts/template.htmlasset13,263 bytesscripts/template_ebook.htmlasset7,158 bytestests/.artifacts/.gitkeepasset1 bytestests/.artifacts/README.mddoc289 bytestests/baselines/README.mddoc3,905 bytestests/baselines/diligent-dick/SOURCE.mddoc4,329 bytestests/baselines/diligent-dick/diligent-dick.epubasset352,310 bytestests/baselines/sleepy-hollow/SOURCE.mddoc2,806 bytestests/baselines/sleepy-hollow/sleepy-hollow.epubasset287,033 bytestests/baselines/standard-alice/SOURCE.mddoc5,083 bytestests/baselines/standard-alice/standard-alice.epubasset10,635,439 bytestests/test_calibre_html_publish.pyruns3,705 bytestests/test_chunk_context.pyruns3,110 bytestests/test_convert.pyruns52,078 bytestests/test_glossary.pyruns31,506 bytestests/test_manifest.pyruns4,018 bytestests/test_merge_and_build.pyruns29,686 bytestests/test_merge_meta.pyruns93,250 bytestests/test_meta.pyruns6,242 bytestests/test_run_state.pyruns8,159 bytes
Read SKILL.md
# Book Translation Skill
You are a book translation assistant. You translate entire books from one language to another by orchestrating a multi-step pipeline.
## Workflow
### 1. Collect Parameters
Determine the following from the user's message:
- **file_path**: Path to the input file (PDF, DOCX, EPUB, or Markdown) — REQUIRED
- **target_lang**: Target language code (default: `zh`) — e.g. zh, en, ja, ko, fr, de, es
- **concurrency**: Number of parallel sub-agents per batch (default: `8`)
- **temp_root**: Optional directory under which `{filename}_temp/` should be created
- **epub_cover**: Optional explicit cover image path for EPUB outputView the complete source on GitHubSkills included
- translate-book
Repository facts
- License
- MIT
- Created
- Mar 15, 2026
- Last pushed
- Oct 29, 2026
- Forks
- 271
- Open issues
- 1
- Project activity
- Active
Rank over the last 12 weeks
Now #488 · best #420 · down 40 in 30 days
- #503 on Nov 1
- #504 on Nov 2
- #503 on Nov 3
- #491 on Nov 4
- #489 from Nov 5 to Nov 6
- #488 since Nov 7
79 earlier periods
- #534 on Aug 2
- #528 on Aug 7
- #524 on Aug 8
- #511 on Aug 9
- #525 on Aug 10
- #528 on Aug 11
- #524 from Aug 12 to Aug 14
- #508 on Aug 15
- #515 on Aug 16
- #517 on Aug 17
- #533 on Aug 18
- #525 on Aug 19
- #524 on Aug 20
- #529 on Aug 21
- #512 on Aug 22
- #530 on Aug 23
- #531 on Aug 24
- #541 on Aug 25
- #528 on Aug 26
- #540 on Aug 27
- #539 on Aug 28
- #521 on Aug 29
- #511 on Aug 30
- #538 on Aug 31
- #544 on Sep 1
- #536 on Sep 2
- #519 on Sep 3
- #472 on Sep 4
- #468 on Sep 5
- #466 on Sep 6
- #454 on Sep 7
- #456 on Sep 8
- #447 on Sep 9
- #444 on Sep 10
- #442 on Sep 11
- #439 on Sep 12
- #438 on Sep 13
- #448 on Sep 14
- #445 on Sep 15
- #452 on Sep 16
- #442 on Sep 17
- #449 on Sep 18
- #433 on Sep 19
- #441 on Sep 20
- #443 on Sep 21
- #447 on Sep 22
- #441 on Sep 23
- #432 on Sep 24
- #431 on Sep 25
- #428 on Sep 26
- #439 on Sep 27
- #444 on Sep 28
- #450 on Sep 29
- #446 on Sep 30
- #440 on Oct 1
- #439 on Oct 2
- #427 on Oct 3
- #420 on Oct 4
- #431 on Oct 5
- #437 on Oct 6
- #443 on Oct 7
- #448 on Oct 8
- #451 on Oct 9
- #444 from Oct 10 to Oct 11
- #456 on Oct 12
- #451 on Oct 13
- #454 on Oct 14
- #455 on Oct 15
- #450 on Oct 17
- #460 on Oct 18
- #472 from Oct 19 to Oct 20
- #479 on Oct 21
- #472 on Oct 22
- #471 on Oct 23
- #458 on Oct 24
- #495 on Oct 25
- #500 on Oct 28
- #501 on Oct 29
- #502 from Oct 30 to Oct 31
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 4, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 30 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- 1 broad permissionin 1 file: SKILL.md:1
- No dangerous shell commands
- 67 network referencesin 6 files: tests/test_convert.py:562 README.md:11 README.zh-CN.md:11 and 3 more
- 3 obfuscation signalsin 1 file: scripts/convert.py:929
- No instruction overrides
- 18 executable scriptsin 18 files: scripts/calibre_html_publish.py:1 scripts/chunk_context.py:1 scripts/convert.py:1 and 15 more
- No access to secrets
- No requests to vote in Hot
Show all 89 signals by file
.github/FUNDING.yml
README.md
- Network accessline 11
> Inspired by [claude_translater](https://github.com/wizlijun/claude_translater). The original project uses shell scripts as its entry point, coordinating the Claude CLI with multiple step scripts to perform chunked translation. This projec - Network accessline 53
- **Agent runtime** — Codex, Claude Code, or OpenClaw, installed and ready to run skills - **Calibre** — `ebook-convert` command must be available ([download](https://calibre-ebook.com/)) - Network accessline 54
- **Calibre** — `ebook-convert` command must be available ([download](https://calibre-ebook.com/)) - Network accessline 55
- **Pandoc** — for HTML↔Markdown conversion ([download](https://pandoc.org/)) - Network accessline 74
mkdir -p ~/.agents/skills git clone https://github.com/deusyu/translate-book.git ~/.agents/skills/translate-book - Network accessline 75
git clone https://github.com/deusyu/translate-book.git ~/.agents/skills/translate-book - Network accessline 89
mkdir -p ~/.claude/skills git clone https://github.com/deusyu/translate-book.git ~/.claude/skills/translate-book - Network accessline 90
git clone https://github.com/deusyu/translate-book.git ~/.claude/skills/translate-book - Network accessline 170
For bugs and feature requests, please open a [GitHub issue](https://github.com/deusyu/translate-book/issues) as described above. For questions, ideas, or anything else, you can reach me here: - Network accessline 172
| Channel | Link | |---------|------| | X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) | - Network accessline 173
|---------|------| | X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) | | Telegram | [@DeusThink](https://t.me/DeusThink) | - Network accessline 174
| X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) | - Network accessline 175
| Telegram | [@DeusThink](https://t.me/DeusThink) | - Network accessline 176
| Telegram Group (Chinese) | [@talkdeusyu](https://t.me/talkdeusyu) | - Network accessline 177
| Telegram Channel (Chinese) | [@lovedesuyu](https://t.me/lovedesuyu) | - Network accessline 318
Tracking [issue #7](https://github.com/deusyu/translate-book/issues/7) — name/term inconsistency and pronoun/gender errors across chunks. The pipeline now covers high-frequency entities, alias/spelling drift, adjacent-chunk pronoun context, - Network accessline 358
[](https://star-history.com/#deusyu/translate-book&Date) - Network accessline 364
[](https://github.com/sponsors/deusyu)
README.zh-CN.md
- Network accessline 11
> 本项目受 [claude_translater](https://github.com/wizlijun/claude_translater) 启发。原项目以 shell 脚本为入口,配合 Claude CLI 和多个步骤脚本完成分块翻译;本项目则将流程重构为可在 Codex、Claude Code 和 OpenClaw 中使用的 Agent Skill,使用 subagent 按 chunk 并行翻译,并引入 manifest 驱动的完整性校验,将续跑和多格式输出整合为 - Network accessline 53
- **Agent 运行环境** — Codex、Claude Code 或 OpenClaw,已安装并可运行 Skill - **Calibre** — `ebook-convert` 命令可用([下载](https://calibre-ebook.com/)) - Network accessline 54
- **Calibre** — `ebook-convert` 命令可用([下载](https://calibre-ebook.com/)) - Network accessline 55
- **Pandoc** — 用于 HTML↔Markdown 转换([下载](https://pandoc.org/)) - Network accessline 74
mkdir -p ~/.agents/skills git clone https://github.com/deusyu/translate-book.git ~/.agents/skills/translate-book - Network accessline 75
git clone https://github.com/deusyu/translate-book.git ~/.agents/skills/translate-book - Network accessline 89
mkdir -p ~/.claude/skills git clone https://github.com/deusyu/translate-book.git ~/.claude/skills/translate-book - Network accessline 90
git clone https://github.com/deusyu/translate-book.git ~/.claude/skills/translate-book - Network accessline 170
Bug 和功能需求请按上一节的要求提 [GitHub issue](https://github.com/deusyu/translate-book/issues)。使用上的疑问、想法或其他事情,可以通过下面这些方式找到我: - Network accessline 172
| 渠道 | 链接 | |------|------| | X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) | - Network accessline 173
|------|------| | X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) | | Telegram | [@DeusThink](https://t.me/DeusThink) | - Network accessline 174
| X (Twitter) | [@0xdeusyu](https://x.com/0xdeusyu) | - Network accessline 175
| Telegram | [@DeusThink](https://t.me/DeusThink) | - Network accessline 176
| Telegram 交流群 | [@talkdeusyu](https://t.me/talkdeusyu) | - Network accessline 177
| Telegram 频道 | [@lovedesuyu](https://t.me/lovedesuyu) | - Network accessline 318
跟踪 [issue #7](https://github.com/deusyu/translate-book/issues/7) — chunk 之间的人名/术语不一致以及代词/性别错误。当前流水线已覆盖高频实体、别名/拼写漂移、相邻 chunk 的代词上下文,以及术语表变更后的精确重译。整书自然度校验仍是后续质量阶段。整体方案分为四个可独立交付的阶段。 - Network accessline 358
[](https://star-history.com/#deusyu/translate-book&Date) - Network accessline 364
[](https://github.com/sponsors/deusyu)
SKILL.md
- Broad permissionsline 1
Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion - Network accessline 3
description: Translate books (PDF/DOCX/EPUB) into any language using parallel sub-agents. Converts input -> Markdown chunks -> translated chunks -> HTML/DOCX/EPUB/PDF. allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuesti - Network accessline 4
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, Agent, AskUserQuestion metadata: {"openclaw":{"requires":{"bins":["python3","pandoc","ebook-convert"],"anyBins":["calibre","ebook-convert"]},"homepage":"https://github.com/deusyu/translate - Network accessline 5
metadata: {"openclaw":{"requires":{"bins":["python3","pandoc","ebook-convert"],"anyBins":["calibre","ebook-convert"]},"homepage":"https://github.com/deusyu/translate-book"}}
scripts/calibre_html_publish.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/chunk_context.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/convert.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 94
namespaces = { 'opf': 'http://www.idpf.org/2007/opf', - Network accessline 95
'opf': 'http://www.idpf.org/2007/opf', - Network accessline 96
'dc': 'http://purl.org/dc/elements/1.1/', - Network accessline 97
'dcterms': 'http://purl.org/dc/terms/' - Possible obfuscationline 929
metadata, body = split_front_matter(content.replace('<U+FEFF>', '')) - Possible obfuscationline 948
content = content.replace('<U+FEFF>', '').replace(' ', ' ') - Possible obfuscationline 980
data = base64.b64decode(data_uri.group(2)) - Network accessline 1519
if not calibre_path: print("Error: Calibre ebook-convert not found") print("Please install Calibre: https://calibre-ebook.com/") - Network accessline 1520
print("Error: Calibre ebook-convert not found") print("Please install Calibre: https://calibre-ebook.com/") sys.exit(1) - Network accessline 1521
print("Please install Calibre: https://calibre-ebook.com/")
scripts/glossary.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/manifest.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/merge_and_build.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/merge_meta.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/meta.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/run_state.py
- Executable scriptline 1
#!/usr/bin/env python3
tests/test_calibre_html_publish.py
- Executable scriptline 1
Executable file
tests/test_chunk_context.py
- Executable scriptline 1
Executable file
tests/test_convert.py
- Executable scriptline 1
Executable file - Network accessline 562
_link("#calibre_link-1", _str("cross-reference")), _str(","), SPACE, _span(*_words("sic erat"), attrs=[("lang", "lat")]), SPACE, _link("https://example.com", _str("site"))), - Network accessline 563
_span(*_words("sic erat"), attrs=[("lang", "lat")]), SPACE, _link("https://example.com", _str("site"))), ) - Network accessline 564
_link("https://example.com", _str("site"))), - Network accessline 570
doc["blocks"][0]["c"], [*_words("A page anchor"), SPACE, _str("cross-reference,"), SPACE, *_words("sic erat"), SPACE, _link("https://example.com", _str("site"))], - Network accessline 571
[*_words("A page anchor"), SPACE, _str("cross-reference,"), SPACE, *_words("sic erat"), SPACE, _link("https://example.com", _str("site"))], ) - Network accessline 572
*_words("sic erat"), SPACE, _link("https://example.com", _str("site"))], - Network accessline 618
doc = _doc(_para( _str("A"), _span(SPACE, _span(ident="page_3")), _str("B"), _link("https://example.com", SPACE), _str("C"), - Network accessline 619
_str("A"), _span(SPACE, _span(ident="page_3")), _str("B"), _link("https://example.com", SPACE), _str("C"), )) - Network accessline 620
_link("https://example.com", SPACE), _str("C"), - Network accessline 628
# Calibre classes such as `pcalibre1` survive on external links and # would be written out as `[site](https://example.com){.pcalibre1}`. - Network accessline 629
# would be written out as `[site](https://example.com){.pcalibre1}`. - Network accessline 630
link = {"t": "Link", "c": [["calibre_link-5", ["pcalibre1", "pcalibre"], [["type", "x"]]], [_str("site")], ["https://example.com", "Example"]]} - Network accessline 631
[_str("site")], ["https://example.com", "Example"]]} - Network accessline 636
self.assertEqual( doc["blocks"][0]["c"][-1], {"t": "Link", "c": [["", [], []], [_str("site")], ["https://example.com", "Example"]]}, - Network accessline 637
doc["blocks"][0]["c"][-1], {"t": "Link", "c": [["", [], []], [_str("site")], ["https://example.com", "Example"]]}, ) - Network accessline 638
{"t": "Link", "c": [["", [], []], [_str("site")], ["https://example.com", "Example"]]}, - Network accessline 1126
def test_leaves_remote_and_missing_images_untouched(self): with tempfile.TemporaryDirectory() as tmp: text = "\n\n" - Network accessline 1127
with tempfile.TemporaryDirectory() as tmp: text = "\n\n" md = self._source(tmp, text) - Network accessline 1128
text = "\n\n"
tests/test_glossary.py
- Executable scriptline 1
Executable file
tests/test_manifest.py
- Executable scriptline 1
Executable file
tests/test_merge_and_build.py
- Executable scriptline 1
Executable file
tests/test_merge_meta.py
- Executable scriptline 1
Executable file
tests/test_meta.py
- Executable scriptline 1
Executable file
tests/test_run_state.py
- Executable scriptline 1
Executable file
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 2 facts
- Contacts www.idpf.org, which SKILL.md, the README and the plugin manifest do not mentionscripts/convert.py:95High confidence
- Contacts purl.org, which SKILL.md, the README and the plugin manifest do not mentionscripts/convert.py:96High confidence
Signal confidence: 87 facts
- Network access in prose of documentationREADME.md:11Low confidence
- Network access in prose of documentationREADME.md:53Low confidence
- Network access in prose of documentationREADME.md:54Low confidence
- Network access in prose of documentationREADME.md:55Low confidence
- Network access in code of documentationREADME.md:74Low confidence
- Network access in code of documentationREADME.md:75Low confidence
- Network access in code of documentationREADME.md:89Low confidence
- Network access in code of documentationREADME.md:90Low confidence
- Network access in prose of documentationREADME.md:170Low confidence
- Network access in prose of documentationREADME.md:172Low confidence
- Network access in prose of documentationREADME.md:173Low confidence
- Network access in prose of documentationREADME.md:174Low confidence
- Network access in prose of documentationREADME.md:175Low confidence
- Network access in prose of documentationREADME.md:176Low confidence
- Network access in prose of documentationREADME.md:177Low confidence
- Network access in prose of documentationREADME.md:318Low confidence
- Network access in prose of documentationREADME.md:358Low confidence
- Network access in prose of documentationREADME.md:364Low confidence
- Network access in prose of documentationREADME.zh-CN.md:11Low confidence
- Network access in prose of documentationREADME.zh-CN.md:53Low confidence
- Network access in prose of documentationREADME.zh-CN.md:54Low confidence
- Network access in prose of documentationREADME.zh-CN.md:55Low confidence
- Network access in code of documentationREADME.zh-CN.md:74Low confidence
- Network access in code of documentationREADME.zh-CN.md:75Low confidence
- Network access in code of documentationREADME.zh-CN.md:89Low confidence
- Network access in code of documentationREADME.zh-CN.md:90Low confidence
- Network access in prose of documentationREADME.zh-CN.md:170Low confidence
- Network access in prose of documentationREADME.zh-CN.md:172Low confidence
- Network access in prose of documentationREADME.zh-CN.md:173Low confidence
- Network access in prose of documentationREADME.zh-CN.md:174Low confidence
- Network access in prose of documentationREADME.zh-CN.md:175Low confidence
- Network access in prose of documentationREADME.zh-CN.md:176Low confidence
- Network access in prose of documentationREADME.zh-CN.md:177Low confidence
- Network access in prose of documentationREADME.zh-CN.md:318Low confidence
- Network access in prose of documentationREADME.zh-CN.md:358Low confidence
- Network access in prose of documentationREADME.zh-CN.md:364Low confidence
- Broad permissions in the frontmatter of the SKILL.mdSKILL.md:1High confidence
- Network access in the frontmatter of the SKILL.mdSKILL.md:3Low confidence
- Network access in the frontmatter of the SKILL.mdSKILL.md:4Low confidence
- Network access in the frontmatter of the SKILL.mdSKILL.md:5Low confidence
- Executable script in code of a file that runsscripts/calibre_html_publish.py:1High confidence
- Executable script in code of a file that runsscripts/chunk_context.py:1High confidence
- Executable script in code of a file that runsscripts/convert.py:1High confidence
- Network access in code of a file that runsscripts/convert.py:94High confidence
- Network access in code of a file that runsscripts/convert.py:95High confidence
- Network access in code of a file that runsscripts/convert.py:96High confidence
- Network access in code of a file that runsscripts/convert.py:97High confidence
- Possible obfuscation in code of a file that runsscripts/convert.py:929High confidence
- Possible obfuscation in code of a file that runsscripts/convert.py:948High confidence
- Possible obfuscation in code of a file that runsscripts/convert.py:980High confidence
and 37 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Path .claude/commands/release.md | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/deusyu-translate-book/)