一键导入
aio-epub-review
Deep literary review of translated EPUB chapters — evaluate translation quality, fix consistency issues, and check cross-chapter coherence.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Deep literary review of translated EPUB chapters — evaluate translation quality, fix consistency issues, and check cross-chapter coherence.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Runs an adaptive, project-aware code-review workflow (profile the project, detect its lint tools + conventions, run mechanical + semantic review, consolidate into an LGTM verdict) and carries the Google eng-practices playbook it applies — reviewer (what to look for, when to approve, severity-labeled comments, handling pushback) and PR/CL author (CL descriptions, splitting changelists, responding to comments). Use when reviewing or authoring a PR/MR/CL/diff, running a code review, deciding LGTM or LGTM threshold, authoring a merge request, assessing code health, handling a hotfix review, or replying to review feedback.
Push books/docs and read notes from an Onyx BOOX e-reader account (push.boox.com / send2boox.com) WITHOUT the web UI, via the self-contained `boox.mjs` CLI. Uploads a file to Aliyun OSS, writes a digital_content doc into the device's MESSAGE sync channel, and calls saveAndPush to notify the device — the exact 3-step flow the web app performs. Also lists the push list, lists synced notes, removes pushed items, and shows device online status. Auth = long-lived JWT via BOOX_TOKEN env or a token file.
Capture this session's repeatable process into a reusable SKILL.md file via guided interview.
Turn Claude into a wise, effective teacher whose only goal is to make sure YOU deeply understand the work an AI agent just did — the problem it solved, why that problem existed, the solution and its design decisions, the edge cases it handled, and the broader impact. Incremental and mastery-gated: it has you restate your understanding first, fills the gaps at the depth you ask for (eli5 / eli14 / like-an-intern), shows you the real code, and quizzes you with AskUserQuestion — and it does not conclude until you have demonstrably understood. Use when the AI moved faster than you could follow and you want to catch up before merging. Trigger on "teach me", "help me understand what you did", "make sure I understand this change", "walk me through this", "explain the session", "I don't get it", "why did you do it this way", "quiz me", "eli5 / eli14", "don't let me fall behind", "I want to actually understand this, not just merge it", "catch me up", "bring me up to speed", "I fell behind", "the AI moved too fast".
Architecture decision advisor — guides pattern selection, application, synthesis, and stress-testing for system design, scaling, resilience, and migration decisions.
Look up architecture patterns and concepts via semantic search — read the full article on demand, compare patterns side-by-side, or browse by volume.
| name | aio-epub-review |
| description | Deep literary review of translated EPUB chapters — evaluate translation quality, fix consistency issues, and check cross-chapter coherence. |
| when_to_use | review translation, đánh giá bản dịch, review chapter, kiểm tra dịch, consistency check, kiểm tra nhất quán, fix translation, sửa bản dịch, literary review, cross-chapter coherence, tone review, fluency check |
| effort | medium |
| argument-hint | book ID and optional chapter number |
Đánh giá chất lượng dịch thuật ở mức văn học — không chỉ check cơ học (empty/short) mà phân tích tone, fluency, consistency, style.
Khác với
aio-epub-quality: Quality skill check cơ học (empty, mixed language, too short). Review skill đọc và đánh giá CHẤT LƯỢNG VĂN HỌC bằng khả năng ngôn ngữ của Agent.
import json, urllib.request, os
BASE = "https://read-api.aiocean.dev/ListBooks.v1.BookService"
KEY = os.environ.get("AIO_EPUB_API_KEY", "")
def api(method, body):
data = json.dumps(body).encode('utf-8')
req = urllib.request.Request(f"{BASE}/{method}", data=data, headers={
"Content-Type": "application/json",
"X-License-Key": KEY
})
with urllib.request.urlopen(req) as resp:
return json.loads(resp.read())
BƯỚC BẮT BUỘC — Đọc rubric trước khi review:
REFS="${CLAUDE_PLUGIN_ROOT}/skills/aio-epub-vn-style/references"
echo "$REFS"
Đọc các file reference:
| File | Nội dung |
|---|---|
$REFS/quality-rubric.md | MQM/ATA framework, error classification, scoring |
$REFS/common-errors.md | 6 lỗi phổ biến cần phát hiện |
$REFS/translation-principles.md | Tín-Đạt-Nhã criteria |
# Book guideline — tiêu chuẩn đã đặt ra khi analyze
gl = api("GetGuideline", {"bookId": BOOK_ID})
guideline = gl.get("guideline", "")
# Chapter context — glossary + previous chapter
context = api("GetChapterContext", {
"bookId": BOOK_ID,
"filePath": FILE_PATH
})
glossary = context.get("glossary", [])
page = api("GetPageJson", {
"bookId": BOOK_ID,
"filePath": FILE_PATH,
"size": 0, "offset": 0
})
contents = page["contents"]
# Hiển thị song song original ↔ translation
for item in contents:
original = item.get("contentText", "")
translations = item.get("translations", [])
translated = translations[0].get("contentText", "") if translations else ""
content_id = item.get("contentId", "")
if translated:
print(f"[{content_id}]")
print(f" EN: {original[:200]}")
print(f" VI: {translated[:200]}")
print()
Đọc từng cặp original/translation và đánh giá theo 5 tiêu chí:
Tìm các pattern lỗi phổ biến (từ common-errors.md):
| Lỗi | Ví dụ sai | Sửa thành |
|---|---|---|
| Calque (dịch sát từ) | "Cô ấy đã có một thời gian khó khăn" | "Cô ấy đã trải qua quãng thời gian chật vật" |
| Lạm dụng bị động | "Cuốn sách được viết bởi tác giả" | "Tác giả viết cuốn sách này" |
| Câu cứng cấu trúc Anh | "Nó là quan trọng rằng..." | "Điều quan trọng là..." |
| Đại từ không nhất quán | "anh ấy" → "hắn" → "anh ta" (cùng nhân vật) | Chọn 1 và dùng xuyên suốt |
| Từ sáo rỗng dịch thuật | "Nói một cách khác", "Sự thật là..." | Diễn đạt tự nhiên hơn |
| Mất giọng tác giả | Sách conversational → dịch ra academic | Giữ đúng tone |
# Dùng translationId (từ GetPageJson → translations[].translationId)
result = api("EditTranslation", {
"bookId": BOOK_ID,
"filePath": FILE_PATH,
"translationId": TRANSLATION_ID,
"content": "Bản dịch đã sửa..."
})
Chú ý:
EditTranslationdùngtranslationId+content, KHÔNG phảicontentId+translatedContent.
result = api("BulkEditTranslation", {
"bookId": BOOK_ID,
"edits": [
{"filePath": "xhtml/ch01.html", "contentId": "id-1", "translatedContent": "Bản dịch sửa 1"},
{"filePath": "xhtml/ch05.html", "contentId": "id-2", "translatedContent": "Bản dịch sửa 2"},
{"filePath": "xhtml/ch10.html", "contentId": "id-3", "translatedContent": "Bản dịch sửa 3"}
]
})
print(f"Updated: {result.get('updatedCount', 0)}, Failed: {result.get('failedCount', 0)}")
BulkEditTranslationdùngcontentId+translatedContent(khác vớiEditTranslationdùngtranslationId+content).
# Tìm tất cả chỗ dùng "self" trong bản gốc
results = api("SearchTranslations", {
"bookId": BOOK_ID,
"query": "self",
"scope": "SEARCH_SCOPE_ORIGINAL",
"limit": 50
})
print(f"Found {results['totalCount']} matches")
for r in results.get("results", []):
print(f" [{r['filePath']}] {r['contentId']}")
print(f" EN: {r['originalText'][:100]}")
print(f" VI: {r.get('translatedText', '(chưa dịch)')[:100]}")
# Tìm thuật ngữ trong bản dịch — check consistency
results = api("SearchTranslations", {
"bookId": BOOK_ID,
"query": "bản ngã",
"scope": "SEARCH_SCOPE_TRANSLATION",
"limit": 100
})
# So sánh: có chỗ nào dịch "self" thành "bản thân" thay vì "bản ngã"?
# Dùng BatchGetPageJson — 1 call thay vì N calls
batch = api("BatchGetPageJson", {
"bookId": BOOK_ID,
"filePaths": ["xhtml/ch01.html", "xhtml/ch05.html", "xhtml/ch10.html"],
"filter": "CONTENT_FILTER_TRANSLATED" # Chỉ lấy items đã dịch
})
for ch in batch.get("chapters", []):
print(f"\n=== {ch['filePath']} ({ch['totalItems']} items) ===")
for item in ch["contents"][:3]:
orig = item.get("contentText", "")[:80]
trans = item["translations"][0]["contentText"][:80] if item.get("translations") else ""
print(f" EN: {orig}")
print(f" VI: {trans}")
Agent kiểm tra across chapters:
SearchTranslations tìm term trong bản dịch — có nhất quán không?# 1. Search tìm chỗ dịch sai
results = api("SearchTranslations", {
"bookId": BOOK_ID,
"query": "anh ấy", # thuật ngữ muốn thay
"scope": "SEARCH_SCOPE_TRANSLATION",
"limit": 100
})
# 2. Bulk edit tất cả
edits = []
for r in results.get("results", []):
new_text = r["translatedText"].replace("anh ấy", "hắn")
edits.append({
"filePath": r["filePath"],
"contentId": r["contentId"],
"translatedContent": new_text
})
result = api("BulkEditTranslation", {
"bookId": BOOK_ID,
"edits": edits
})
print(f"Fixed {result.get('updatedCount', 0)} translations across chapters")
📊 Translation Review: Chapter 5 — "The Power of Small Wins"
Score: 82/100 (Good)
Tín (Accuracy): 90/100 — 2 chỗ bỏ sót ý phụ
Đạt (Fluency): 78/100 — 5 câu còn cứng theo cấu trúc Anh
Nhã (Style): 85/100 — Tone đúng, nhưng thiếu từ láy
Nhất quán: 75/100 — "habit" dịch 2 cách: "thói quen" & "tập quán"
Văn hóa: 88/100 — OK
Issues Found: 8
[FIXED] id-042: Calque "có một thời gian khó khăn" → "trải qua quãng chật vật"
[FIXED] id-067: Bị động "được thực hiện bởi" → "do... thực hiện"
[FIXED] id-089: Thuật ngữ "tập quán" → "thói quen" (match glossary)
[FLAG] id-103: Câu dài 4 dòng, cần tách — cần human review
[FIXED] id-115: Đại từ "anh ta" → "anh" (match guideline)
...
Fixes Applied: 5/8
Needs Human Review: 3
Agent: review chapter 5 of book X
→ Chạy steps 1-6 cho 1 chapter
Agent: review chapters 1-10 for consistency
→ Chạy steps 1-7, focus on cross-chapter issues
Agent: review entire book X
→ Sample every chapter, focus on consistency + overall quality
→ Produce book-level report
| Bạn muốn... | Dùng skill |
|---|---|
| Check cơ học trước (empty, mixed lang) | aio-epub-quality |
| Dịch lại chapter kém chất lượng | aio-epub-translate |
| Xem/update guideline | aio-epub-manage |
| Phân tích sách trước khi dịch | aio-epub-analyze |
| Xuất sách khi review xong | aio-epub-export |
Workflow: aio-epub-setup → aio-epub-upload → aio-epub-analyze → aio-epub-translate → aio-epub-quality → aio-epub-review → aio-epub-export