with one click
review-translation
// 번역된 한국어 콘텐츠의 품질을 AI로 검증합니다. 원문과 번역본을 비교하여 정확성, 완전성, 자연스러움, 용어 일관성을 평가합니다. Claude, Codex, Gemini CLI 3개 AI로 교차 검증하여 합의된 이슈를 우선 표시합니다. 사용: /review-translation week1/slug
// 번역된 한국어 콘텐츠의 품질을 AI로 검증합니다. 원문과 번역본을 비교하여 정확성, 완전성, 자연스러움, 용어 일관성을 평가합니다. Claude, Codex, Gemini CLI 3개 AI로 교차 검증하여 합의된 이슈를 우선 표시합니다. 사용: /review-translation week1/slug
| name | review-translation |
| description | 번역된 한국어 콘텐츠의 품질을 AI로 검증합니다. 원문과 번역본을 비교하여 정확성, 완전성, 자연스러움, 용어 일관성을 평가합니다. Claude, Codex, Gemini CLI 3개 AI로 교차 검증하여 합의된 이슈를 우선 표시합니다. 사용: /review-translation week1/slug |
| arguments | [{"name":"path","description":"week/slug 또는 week/parent/child 형식의 문서 경로\n- 단일 페이지: week1/how-openai-uses-codex\n- YouTube 챕터: week1/deep-dive-llms/introduction\n","required":true},{"name":"claude-only","description":"Claude만 사용 (외부 CLI 미설치 시)","required":false},{"name":"skip-integration","description":"통합 리포트 생성 스킵 (개별 리포트만)","required":false}] |
번역된 한국어 콘텐츠의 품질을 3개 AI(Claude, Codex, Gemini)로 교차 검증합니다.
# 기본 (3개 AI 교차 검증)
/review-translation <week/slug>
# Claude만 사용
/review-translation <week/slug> --claude-only
# 통합 리포트 스킵
/review-translation <week/slug> --skip-integration
# 단일 페이지
/review-translation week1/how-openai-uses-codex
# YouTube 개별 챕터
/review-translation week1/deep-dive-llms/introduction
/review-translation week1/prompt-engineering-guide/zeroshot
| 구조 | 원본 (eng) 경로 | 번역 (kr) 경로 |
|---|---|---|
| 기본 구조 | docs/week{N}/{slug}/eng/{file}.md | docs/week{N}/{slug}/kr/{file}.md |
| 레거시 구조 | docs/week{N}/{slug}/{file}.md | docs/week{N}/{slug}/kr/{file}.md |
경로 예시:
# 기본 구조 (eng/kr 분리)
week1/deep-dive-llms/introduction
→ 원본: docs/week1/deep-dive-llms/eng/introduction.md
→ 번역: docs/week1/deep-dive-llms/kr/introduction.md
week1/how-openai-uses-codex
→ 원본: docs/week1/how-openai-uses-codex/eng/*.md
→ 번역: docs/week1/how-openai-uses-codex/kr/*.md
# 레거시 구조 (eng 없이 직접)
week1/prompt-engineering-guide/zeroshot
→ 원본: docs/week1/prompt-engineering-guide/zeroshot.md
→ 번역: docs/week1/prompt-engineering-guide/kr/zeroshot.md
.claude/outputs/review-translation/
└── week{N}/{slug}/
├── claude-review.json # Claude 리뷰
├── codex-review.json # Codex 리뷰
├── gemini-review.json # Gemini 리뷰
└── integrated-report.md # 통합 리포트
# 챕터별 리뷰 시
.claude/outputs/review-translation/
└── week{N}/{slug}/{chapter}/
├── claude-review.json
├── codex-review.json
├── gemini-review.json
└── integrated-report.md
/review-translation week1/how-openai-uses-codex
│
▼
┌──────────────────────────────────────┐
│ 1. 파일 읽기 │
│ - 원본 마크다운 │
│ - 번역 마크다운 │
│ - 용어집 (참조) │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 2. 프롬프트 생성 │
│ external-prompt.md 템플릿 사용 │
│ 변수 치환: 원본, 번역, 용어집 │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 3. 병렬 AI 리뷰 실행 │
│ ┌─────────┬─────────┬─────────┐ │
│ │ Claude │ Codex │ Gemini │ │
│ │ (Task) │ (Bash) │ (Bash) │ │
│ └─────────┴─────────┴─────────┘ │
│ 동시 실행 (3분 타임아웃) │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 4. 개별 리포트 저장 │
│ claude-review.json │
│ codex-review.json │
│ gemini-review.json │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 5. Task: report-integrator │
│ 3개 리포트 통합 │
│ → integrated-report.md │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 6. 결과 요약 출력 │
│ 점수, 합의/개별 이슈, 권장 조치 │
└──────────────────────────────────────┘
이 스킬이 호출되면 다음 단계를 따르세요.
경로 구조 확인:
- 2단계 (week1/slug): 디렉토리 전체 또는 단일 파일
- 3단계 (week1/slug/chapter): 개별 챕터
파일 경로 결정 로직:
1. 먼저 eng 디렉토리 확인: docs/week{N}/{slug}/eng/{chapter}.md
2. eng 없으면 레거시 경로: docs/week{N}/{slug}/{chapter}.md
3. 번역은 항상: docs/week{N}/{slug}/kr/{chapter}.md
예시 - week1/deep-dive-llms/introduction:
1. docs/week1/deep-dive-llms/eng/introduction.md 확인 → 있음 ✓
2. docs/week1/deep-dive-llms/kr/introduction.md 읽기
3. docs/glossary.md 읽기 (용어집)
예시 - week1/prompt-engineering-guide/zeroshot:
1. docs/week1/prompt-engineering-guide/eng/zeroshot.md 확인 → 없음
2. docs/week1/prompt-engineering-guide/zeroshot.md 읽기 (레거시)
3. docs/week1/prompt-engineering-guide/kr/zeroshot.md 읽기
4. docs/glossary.md 읽기 (용어집)
파일이 없는 경우:
- 원본 없음: "원본 파일을 찾을 수 없습니다: {경로}" 에러
- 번역 없음: "번역 파일을 찾을 수 없습니다. /translate-reading 먼저 실행해주세요." 에러
.claude/agents/review-translation/external-prompt.md 템플릿 읽기
변수 치환:
- {{REVIEWER_NAME}}: 각 AI 이름
- {{DOCUMENT_PATH}}: 문서 경로
- {{ENGLISH_SOURCE}}: 원본 내용
- {{KOREAN_TRANSLATION}}: 번역 내용
- {{GLOSSARY}}: 용어집 내용
프롬프트를 임시 파일로 저장:
- /tmp/review-prompt-codex.txt
- /tmp/review-prompt-gemini.txt
--claude-only가 아닌 경우, 3개 AI를 동시에 실행합니다:
Task tool 호출:
- subagent_type: "general-purpose"
- prompt: .claude/agents/review-translation/claude-reviewer.md 내용
+ 원본 마크다운
+ 번역 마크다운
+ 용어집
- description: "claude-reviewer - 번역 품질 검증"
# 프롬프트 파일 생성
cat << 'PROMPT_EOF' > /tmp/review-prompt-codex.txt
[external-prompt.md 내용에 변수 치환]
PROMPT_EOF
# Codex 실행 (타임아웃 3분)
timeout 180 codex exec "$(cat /tmp/review-prompt-codex.txt)" \
-o /tmp/codex-review-output.txt 2>/dev/null
# 또는 JSON 모드
timeout 180 codex exec "$(cat /tmp/review-prompt-codex.txt)" --json 2>/dev/null | \
grep '"type":"assistant"' | tail -1 | jq -r '.message.content[0].text' \
> /tmp/codex-review-output.txt
# 프롬프트 파일 생성
cat << 'PROMPT_EOF' > /tmp/review-prompt-gemini.txt
[external-prompt.md 내용에 변수 치환]
PROMPT_EOF
# Gemini 실행 (타임아웃 3분, yolo 모드)
timeout 180 gemini "$(cat /tmp/review-prompt-gemini.txt)" -y -o json 2>/dev/null | \
jq -r '.text' > /tmp/gemini-review-output.txt
출력 디렉토리 생성:
mkdir -p .claude/outputs/review-translation/week{N}/{slug}/
각 AI 결과를 JSON으로 저장:
- claude-review.json
- codex-review.json (Codex 출력에서 JSON 추출)
- gemini-review.json (Gemini 출력에서 JSON 추출)
JSON 파싱 실패 시:
- 원본 출력을 {ai}-review-raw.txt로 저장
- 에러 메시지 표시 후 계속 진행
Task tool 호출:
- subagent_type: "general-purpose"
- prompt: .claude/agents/review-translation/report-integrator.md 내용
+ Claude 리뷰 JSON
+ Codex 리뷰 JSON
+ Gemini 리뷰 JSON
+ 문서 경로
- description: "report-integrator - 리포트 통합"
결과: 마크다운 형식의 통합 리포트
Write tool로 integrated-report.md 저장
완료 메시지 형식 (3개 AI 모드):
✅ 번역 리뷰 완료!
📊 **종합 점수**: {overall_avg}/10
| 항목 | Claude | Codex | Gemini | 평균 |
|------|--------|-------|--------|------|
| 정확성 | {a1} | {a2} | {a3} | {avg} |
| 완전성 | {c1} | {c2} | {c3} | {avg} |
| 자연스러움 | {n1} | {n2} | {n3} | {avg} |
| 용어 일관성 | {t1} | {t2} | {t3} | {avg} |
📋 **이슈 요약**:
- 합의된 이슈: {N}건 (Critical {N}, Major {N}, Minor {N})
- 개별 의견: {N}건
📁 **리포트 저장 위치**:
.claude/outputs/review-translation/week{N}/{slug}/
├── integrated-report.md (통합)
├── claude-review.json
├── codex-review.json
└── gemini-review.json
💡 **권장 조치**:
{합의된 이슈 기반 권장사항}
Claude만 사용하여 리뷰합니다.
통합 리포트 생성을 스킵합니다.
.claude/agents/review-translation/claude-reviewer.md - Claude 리뷰 에이전트.claude/agents/review-translation/external-prompt.md - Codex/Gemini 프롬프트 템플릿.claude/agents/review-translation/report-integrator.md - 리포트 통합 에이전트npm install -g @openai/codex
codex login # 브라우저 OAuth 인증
npm install -g @google/gemini-cli
gemini # "Login with Google" 선택
| 상황 | 처리 |
|---|---|
| 원본 파일 없음 | "원본 파일을 찾을 수 없습니다: {경로}" |
| 번역 파일 없음 | "번역 파일을 찾을 수 없습니다. /translate-reading 먼저 실행해주세요." |
| Codex CLI 미설치 | which codex 확인 → Claude만 실행 |
| Gemini CLI 미설치 | which gemini 확인 → Claude만 실행 |
| CLI 인증 실패 | "인증 필요: codex login / gemini 재실행" |
| JSON 파싱 실패 | 원본 출력 저장 후 계속 진행 |
| 타임아웃 (3분) | 해당 AI 스킵 후 계속 진행 |
| 점수 | 의미 |
|---|---|
| 9-10 | 출판 수준, 수정 불필요 |
| 7-8 | 양호, Minor 수정 권장 |
| 5-6 | 보통, Major 수정 필요 |
| 3-4 | 미흡, 상당 부분 재번역 권장 |
| 1-2 | 불량, 전체 재번역 필요 |
--all-chapters: 전체 챕터 일괄 리뷰master-report.md: 챕터별 요약 포함 마스터 리포트--review 옵션으로 자동 검증YouTube 콘텐츠의 챕터별 하위페이지 구조를 readings.ts에 생성하고, 전체 번역 파일에서 챕터별 번역 파일을 자동 생성합니다. 사용: /split-youtube-chapters week1/deep-dive-llms
코드 수정 완료 후 conventional commit 형식의 커밋 메시지를 자동 생성하고 사용자 확인 후 커밋합니다. 사용자가 커밋해줘 또는 /commit 요청 시 사용.
readings.ts의 요약 필드가 원본 kr 마크다운과 비교하여 잘 작성되었는지 평가합니다. 이슈별로 개선사항을 제안하고 사용자 컨펌 후 readings.ts를 수정합니다. 사용: /eval-summary week1 또는 /eval-summary week1/slug
나노바나나 프롬프트의 정확성을 한글 번역본과 비교하여 검증하고, WebSearch로 팩트체크한 후 이슈별로 사용자 확인을 거쳐 수정합니다. 사용: /improve-prompt week1/deep-dive-llms/tokenization
Reading 원문에서 나노바나나 프로용 치트시트 프롬프트를 생성합니다. 3단계 에이전트 파이프라인(분석→구조설계→프롬프트생성)으로 콘텐츠 유형에 맞는 프롬프트 생성. 사용: /nanobanana week1/slug
나노바나나에서 생성된 치트시트 이미지를 public에 복사하고 readings.ts에 cheatsheetImage 필드를 추가합니다. 사용: /publish-cheatsheet week1/slug