fetch-reading Skill
URL에서 reading 콘텐츠를 수집하여 마크다운 파일로 저장합니다.
사용법
Week 배치 모드 (권장)
주차 전체 reading을 자동 수집하고 번역합니다.
# Week 2의 모든 reading 수집 + 번역
/fetch-reading week 2
# 수집만 하고 번역은 나중에
/fetch-reading week 3 --skip-translate
단일 URL 수집
# 단일 페이지
/fetch-reading <url>
/fetch-reading <url> --week <N>
/fetch-reading <local-file.pdf>
# 웹 문서 - 하위 페이지 자동 탐색 (기본)
# 하위 페이지가 감지되면 사용자 확인 후 전체 수집
/fetch-reading https://www.promptingguide.ai/techniques
# 웹 문서 - 하위 페이지 탐색 건너뛰기
/fetch-reading <url> --no-subpages
# 수동 계층적 구조 (부모-자식)
/fetch-reading <url> --parent <parent-slug> --child <child-slug>
/fetch-reading <url> --week 1 --parent prompt-engineering-guide --child zeroshot
동작 흐름
Week 배치 모드 동작
/fetch-reading week N 형식으로 호출된 경우의 동작 흐름입니다.
/fetch-reading week N
│
▼
┌──────────────────────────────────────┐
│ 1. syllabus.ts에서 week N readings 추출 │
│ - 각 reading의 URL 수집 │
│ - 이미 수집된 콘텐츠 확인 │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 2. 수집 대상 목록 표시 및 사용자 확인 │
│ - 테이블로 reading 목록 표시 │
│ - AskUserQuestion으로 확인 │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 3. 각 reading별 순차 fetch 실행 │
│ - GitHub/Notion URL은 스킵 │
│ - 실패한 reading은 기록 후 계속 │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 4. fetch 완료된 reading별 translate │
│ - Task tool로 subagent 병렬 실행 │
│ - translate-reading 스킬 호출 │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 5. 최종 결과 요약 │
│ - 성공/실패 reading 목록 │
│ - 다음 단계 안내 │
└──────────────────────────────────────┘
Week 배치 모드 실행 지침
syllabus.ts에서 reading 목록 추출:
- src/content/syllabus.ts 파일 읽기 - week.number === N인 주차 찾기 - readings 배열에서 URL 추출수집 대상 필터링 (이미 수집된 콘텐츠는 자동 스킵):
docs/week{N}/{slug}/eng/index.md또는eng/_index.md존재 시 "⏭️ 이미 수집됨"- GitHub/Notion URL은 "⏸️ 보류" 표시
- 지원되지 않는 URL 형식은 "❌ 지원 안함" 표시
사용자 확인: 먼저 수집 대상 목록을 테이블로 보여준 후 확인:
Week {N}의 Reading 목록: | # | Title | URL | 상태 | |---|-------|-----|------| | 1 | MCP Introduction | https://stytch.com/... | 🔄 수집 예정 | | 2 | Sample MCP Servers | https://github.com/... | ⏸️ 보류 (GitHub) | | 3 | MCP Authentication | https://developers... | ⏭️ 이미 수집됨 |그 다음 AskUserQuestion 호출:
questions: - question: "Week {N}의 {M}개 reading을 수집하고 번역할까요?" header: "배치 처리" options: - label: "수집 + 번역 (권장)" description: "모든 reading을 수집하고 자동으로 번역합니다." - label: "수집만" description: "수집만 하고 번역은 나중에 합니다." - label: "취소" description: "작업을 취소합니다." multiSelect: false순차 fetch 실행: 각 reading에 대해 기존 fetch 로직 실행 (YouTube/PDF/웹)
번역 subagent 병렬 실행 (수집 + 번역 선택 시): 모든 성공적으로 수집된 reading에 대해 단일 메시지에서 여러 Task tool 동시 호출:
Task tool 호출 1: - subagent_type: "general-purpose" - prompt: "/translate-reading week{N}/{slug1} 스킬을 실행하세요. .claude/skills/translate-reading/SKILL.md 지침을 따르세요." - description: "번역: {slug1}" - run_in_background: true Task tool 호출 2: - subagent_type: "general-purpose" - prompt: "/translate-reading week{N}/{slug2} 스킬을 실행하세요." - description: "번역: {slug2}" - run_in_background: true ... (모든 reading에 대해 동시 실행)결과 요약:
✅ Week {N} 배치 처리 완료! 📊 수집: {성공}/{전체}개 완료 📝 번역: {성공}/{전체}개 진행중 | Reading | 수집 | 번역 | |---------|------|------| | mcp-introduction | ✅ | 🔄 진행중 | | mcp-authentication | ✅ | 🔄 진행중 | | sample-mcp-servers | ⏸️ 스킵 (GitHub) | - | 번역 상태 확인: /tasks 명령어로 background task 확인
단일 URL 모드 동작
/fetch-reading <url> 형식으로 호출된 경우의 동작 흐름입니다.
1. URL/파일 분석
입력 유형 판별:
- YouTube URL (
youtube.com,youtu.be) - PDF URL (
.pdf확장자) 또는 로컬 PDF 파일 - ⏸️ GitHub URL (
github.com) - 보류 - ⏸️ Notion URL (
notion.so,notion.site) - 보류 - 일반 웹 URL
- YouTube URL (
보류 소스 체크 (GitHub/Notion):
- URL이
github.com도메인이면 보류 메시지 표시 후 중단 - URL이
notion.so또는notion.site도메인이면 보류 메시지 표시 후 중단
- URL이
Week 번호 결정:
--week파라미터가 있으면 사용- 없으면
src/content/syllabus.ts에서 URL 매칭하여 추론
Slug 생성:
- syllabus.ts의 title에서 생성
- 소문자, 공백→하이픈, 특수문자 제거
- 예: "Deep Dive into LLMs" →
deep-dive-llms
2. 콘텐츠 수집 (유형별)
YouTube 영상
YouTube URL인 경우 yt-dlp를 사용하여 메타데이터, 챕터, 자막을 추출합니다.
YouTube 챕터별 처리 워크플로우
YouTube URL 입력
│
▼
┌──────────────────────────────────────┐
│ yt-dlp --dump-json으로 메타데이터 추출 │
│ - title: 영상 제목 │
│ - uploader: 채널명 (저자) │
│ - duration: 영상 길이 │
│ - chapters: 챕터 배열 │
│ - description: 영상 설명 (백업용) │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 챕터 정보 확보 │
│ - yt-dlp chapters 배열 우선 사용 │
│ - 없으면 description에서 타임스탬프 파싱│
│ - 둘 다 없으면 사용자에게 확인 │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 자막 다운로드 (VTT) │
│ - 수동 영어 자막 우선 │
│ - 자동생성 자막 fallback │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 챕터별 자막 분할 │
│ - 각 챕터의 start_time/end_time 기준 │
│ - 타임스탬프 [HH:MM:SS] 형태로 보존 │
└──────────────────────────────────────┘
│
▼ (각 챕터마다 반복)
┌──────────────────────────────────────┐
│ Task: youtube-chapter-processor │
│ - 자막 텍스트 정리 (중복 제거) │
│ - 챕터 요약 생성 (1-2문장) │
│ - has_meaningful_content 판단 │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 챕터별 콘텐츠 병합 │
│ ## 1. 챕터명, ## 2. 챕터명 ... 형태 │
│ (has_meaningful_content=false는 제외) │
└──────────────────────────────────────┘
YouTube 처리 실행 지침
메타데이터 추출: yt-dlp로 영상 정보 가져오기
yt-dlp --dump-json <URL>챕터 정보 확보:
- yt-dlp
chapters배열 확인 - 없으면
description에서 타임스탬프 패턴 파싱 (예:0:00,1:23:45) - 둘 다 없으면 사용자에게 확인:
이 영상에는 챕터가 없습니다. 어떻게 처리할까요? 1. 수동으로 분할점 입력 (예: "10:00, 25:30, 45:00") 2. 전체를 하나의 섹션으로 처리 3. 시간 기준 자동 분할 (예: 10분 단위)
- yt-dlp
자막 다운로드:
yt-dlp --write-subs --write-auto-subs \ --sub-langs "en" --sub-format "vtt" \ --skip-download \ -o "docs/week{N}/{slug}/media/{slug}" \ <URL>챕터별 자막 분할: 각 챕터의 시작/종료 시간 기준으로 VTT 자막 분할
챕터별 검증: 각 챕터에 대해 Task tool 호출
Task tool 호출: - subagent_type: "general-purpose" - prompt: ".claude/agents/fetch-reading/youtube-chapter-processor.md 에이전트 지침에 따라 챕터의 자막을 검증하고 정제하세요. 챕터 번호: N 챕터 제목: "Introduction" 시작 시간: 0:00 종료 시간: 1:00 자막: (해당 구간 자막 텍스트)" - description: "YouTube 챕터 N 검증"챕터별 파일 저장 (챕터가 있는 경우 자동 분리):
챕터가 있으면 자동으로 디렉토리 구조를 생성합니다:
docs/week{N}/{slug}/ ├── eng/ # 원본 (영어) │ ├── _index.md # 인덱스 파일 (전체 개요 + ToC) │ ├── introduction.md # 챕터 1 │ ├── pretraining-data.md # 챕터 2 │ ├── tokenization.md # 챕터 3 │ └── ... # 나머지 챕터들 └── kr/ # 번역본 (번역 시 생성)인덱스 파일 (
eng/_index.md) 생성:- 영상 메타데이터 (제목, 저자, 길이)
- Table of Contents (챕터 목록 + 링크)
- 전체 요약
챕터별 파일 생성:
has_meaningful_content: true인 챕터만 개별 파일로 저장- 파일명: 챕터 제목에서 slug 생성 (예: "Tokenization" →
tokenization.md)
챕터가 없는 경우:
- 단일 페이지도 폴더 구조로 저장:
docs/week{N}/{slug}/eng/index.md
챕터 데이터 구조
yt-dlp가 반환하는 chapters 배열:
{
"chapters": [
{"start_time": 0.0, "title": "Introduction", "end_time": 60.0},
{"start_time": 60.0, "title": "Pretraining Data", "end_time": 467.0}
]
}
Description에서 챕터 파싱
description에 타임스탬프가 있는 경우 파싱:
0:00 Introduction
1:00 Pretraining Data (Internet)
7:47 Tokenization
정규식 패턴: (\d{1,2}:\d{2}(?::\d{2})?)\s+(.+)
PDF 문서
- 로컬 파일: Read 도구로 직접 읽기
- 원격 URL: WebFetch로 다운로드 후 Read
- Claude의 PDF 읽기 기능으로 페이지별 텍스트 추출
- 각 페이지마다 page-content-validator 에이전트로 정제
PDF 페이지별 처리 워크플로우
PDF 파일 읽기
│
▼
┌──────────────────────────────────────┐
│ 페이지별 텍스트 분리 │
│ [Page 1], [Page 2] ... 마커 기준 │
└──────────────────────────────────────┘
│
▼ (각 페이지마다 반복)
┌──────────────────────────────────────┐
│ Task: page-content-validator │
│ - OCR 노이즈 제거 │
│ - 페이지 번호 제거 │
│ - 무관한 텍스트 제거 │
│ - has_meaningful_content 판단 │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 페이지별 콘텐츠 병합 │
│ ## Page 1, ## Page 2 ... 형태로 구성 │
│ (has_meaningful_content=false는 제외)│
└──────────────────────────────────────┘
PDF 처리 실행 지침
- PDF 읽기: Read 도구로 PDF 파일 전체 읽기
- 페이지 분리:
[Page N]마커를 기준으로 각 페이지 텍스트 분리 - 페이지별 검증: 각 페이지에 대해 Task tool 호출
Task tool 호출: - subagent_type: "general-purpose" - prompt: ".claude/agents/fetch-reading/page-content-validator.md 에이전트 지침에 따라 페이지 N의 텍스트를 검증하고 정제하세요. 페이지 번호: N 텍스트: (해당 페이지 텍스트)" - description: "PDF 페이지 N 검증" - 결과 병합:
has_meaningful_content: true인 페이지만## Page N형태로 병합has_meaningful_content: false인 페이지는 제외
- 목차 생성: 마지막에 각 페이지 요약으로 목차 생성
GitHub 문서 (⏸️ 보류)
⚠️ 현재 보류: GitHub 문서 수집은 현재 지원이 보류되어 있습니다.
GitHub URL이 입력되면 다음 메시지를 표시하고 중단합니다:
⚠️ GitHub 콘텐츠 수집은 현재 지원이 보류되어 있습니다.
해당 URL: https://github.com/...
Notion 문서 (⏸️ 보류)
⚠️ 현재 보류: Notion 페이지 수집은 현재 지원이 보류되어 있습니다.
Notion URL (notion.so, notion.site)이 입력되면 다음 메시지를 표시하고 중단합니다:
⚠️ Notion 콘텐츠 수집은 현재 지원이 보류되어 있습니다.
해당 URL: https://notion.so/...
일반 웹 문서
CRITICAL: 전문 추출 필수 WebFetch는 기본적으로 큰 페이지를 요약합니다. 반드시 아래 prompt를 사용하세요.
WebFetch 호출 시 필수 prompt
WebFetch 호출:
- url: {대상 URL}
- prompt: "이 글의 전체 본문을 마크다운 형식으로 추출하세요.
**절대 요약하지 마세요.** 모든 섹션, 모든 문단, 모든 코드 블록, 모든 표를 빠짐없이 포함하세요.
다음 구조를 유지하세요:
- 모든 헤딩(#, ##, ###) 그대로 보존
- 코드 블록은 ```언어명으로 감싸서 보존
- 표는 마크다운 테이블 형식으로 보존
- 불릿 리스트와 번호 리스트 그대로 보존
- 인용문은 > 형식으로 보존
- 이미지는  형식으로 보존
원문 그대로 전체를 출력하세요."
웹 문서 처리 요약
- WebFetch로 HTML 수집 (전문 추출 prompt 필수)
- 본문 추출 및 마크다운 변환
- 코드 블록, 리스트, 헤딩 구조 보존
- 하위 페이지 자동 탐색: 네비게이션/사이드바에서 하위 페이지 링크 감지
웹 문서 하위 페이지 자동 탐색 워크플로우
웹 문서인 경우, 먼저 하위 페이지가 있는지 자동으로 탐색합니다.
자동 탐색이 건너뛰어지는 경우:
--no-subpages옵션 사용 시--parent와--child옵션으로 수동 지정 시- PDF, GitHub, YouTube 등 웹 문서가 아닌 경우
웹 URL 입력
│
▼
┌──────────────────────────────────────┐
│ WebFetch로 메인 페이지 HTML 수집 │
│ - 네비게이션/사이드바 링크 분석 │
│ - 같은 도메인의 하위 페이지 추출 │
│ - URL 패턴 분석 (예: /techniques/*) │
└──────────────────────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 하위 페이지 감지 여부 확인 │
│ - 감지됨: 사용자 확인 단계로 │
│ - 감지 안됨: 단일 페이지로 처리 │
└──────────────────────────────────────┘
│
▼ (하위 페이지 감지됨)
┌──────────────────────────────────────┐
│ AskUserQuestion으로 사용자 확인 │
│ - 발견된 하위 페이지 목록 표시 │
│ - 전체 수집 / 선택 수집 / 단일 페이지 │
└──────────────────────────────────────┘
│
▼ (사용자 승인)
┌──────────────────────────────────────┐
│ 각 하위 페이지 순차 수집 │
│ - 부모 디렉토리 생성 │
│ - 각 하위 페이지 WebFetch로 수집 │
│ - 개별 마크다운 파일로 저장 │
└──────────────────────────────────────┘
단일 웹 페이지 수집 실행 지침
하위 페이지가 없거나 --no-subpages 옵션 사용 시:
WebFetch 호출:
- url: {대상 URL}
- prompt: "이 글의 전체 본문을 마크다운 형식으로 추출하세요.
**절대 요약하지 마세요.** 모든 섹션, 모든 문단, 모든 코드 블록, 모든 표를 빠짐없이 포함하세요.
다음 구조를 유지하세요:
- 모든 헤딩(#, ##, ###) 그대로 보존
- 코드 블록은 ```언어명으로 감싸서 보존
- 표는 마크다운 테이블 형식으로 보존
- 불릿 리스트와 번호 리스트 그대로 보존
- 인용문은 > 형식으로 보존
- 이미지는  형식으로 보존
원문 그대로 전체를 출력하세요."
결과를 docs/week{N}/{slug}/eng/index.md에 저장합니다.
웹 하위 페이지 탐색 실행 지침
메인 페이지 수집 및 분석:
WebFetch 호출 (하위 페이지 탐색용): - url: {대상 URL} - prompt: "이 페이지의 네비게이션/사이드바에서 하위 페이지 링크를 찾아주세요. 같은 도메인 내의 관련 문서 링크들을 추출하세요. 각 링크의 제목과 URL을 목록으로 알려주세요." 분석 대상: - 사이드바/네비게이션 메뉴의 링크들 - 같은 도메인 또는 같은 경로 패턴의 링크 - "목차", "Table of Contents", "Chapters" 등의 섹션하위 페이지 링크 추출 기준:
- 같은 도메인 내의 링크만 대상
- URL 패턴이 유사한 링크 그룹화 (예:
/techniques/zeroshot,/techniques/fewshot) - 네비게이션/사이드바에 있는 링크 우선
- 외부 링크, 앵커 링크(#), 이미지/미디어 링크 제외
하위 페이지 감지 시 사용자 확인:
하위 페이지를 발견하면 반드시 AskUserQuestion으로 사용자에게 확인:
AskUserQuestion 호출: questions: - question: "이 웹 페이지에서 {N}개의 하위 페이지를 발견했습니다. 어떻게 처리할까요?" header: "하위 페이지" options: - label: "전체 수집 (권장)" description: "발견된 모든 하위 페이지를 수집하여 계층 구조로 저장합니다." - label: "단일 페이지만" description: "현재 페이지만 수집하고 하위 페이지는 무시합니다." - label: "선택적 수집" description: "수집할 하위 페이지를 직접 선택합니다." multiSelect: false확인 전에 발견된 하위 페이지 목록을 먼저 보여주기:
다음 {N}개의 하위 페이지를 발견했습니다: | # | 제목 | URL | |---|------|-----| | 1 | Zero-shot Prompting | /techniques/zeroshot | | 2 | Few-shot Prompting | /techniques/fewshot | | 3 | Chain-of-Thought | /techniques/cot | ... 이 페이지들을 어떻게 처리할까요?전체 수집 선택 시:
- 부모 디렉토리 생성:
docs/week{N}/{parent-slug}/eng/ - 각 하위 페이지를 순차적으로 WebFetch (전문 추출 prompt 필수)
- 개별 마크다운 파일로 저장:
docs/week{N}/{parent-slug}/eng/{child-slug}.md - 하위 페이지의 slug는 URL 경로 또는 제목에서 생성
각 하위 페이지 수집 시 WebFetch 호출:
WebFetch 호출: - url: {하위 페이지 URL} - prompt: "이 글의 전체 본문을 마크다운 형식으로 추출하세요. **절대 요약하지 마세요.** 모든 섹션, 모든 문단, 모든 코드 블록, 모든 표를 빠짐없이 포함하세요. 다음 구조를 유지하세요: - 모든 헤딩(#, ##, ###) 그대로 보존 - 코드 블록은 ```언어명으로 감싸서 보존 - 표는 마크다운 테이블 형식으로 보존 - 불릿 리스트와 번호 리스트 그대로 보존 - 인용문은 > 형식으로 보존 원문 그대로 전체를 출력하세요."- 부모 디렉토리 생성:
선택적 수집 선택 시:
- 추가 AskUserQuestion으로 수집할 페이지 선택 (multiSelect: true)
- 선택된 페이지만 수집
웹 하위 페이지 결과 구조
docs/week1/prompt-engineering-guide/
├── eng/ # 원본 (영어)
│ ├── zeroshot.md # 하위 페이지 1
│ ├── fewshot.md # 하위 페이지 2
│ ├── cot.md # 하위 페이지 3
│ ├── self-consistency.md # 하위 페이지 4
│ └── ... (N개 하위 페이지)
└── kr/ # 번역본 (번역 시 생성)
개별 하위 페이지 파일 형식:
---
title: "Zero-shot Prompting"
source_url: "https://www.promptingguide.ai/techniques/zeroshot"
source_type: web
author: "DAIR.AI"
parent_slug: "prompt-engineering-guide"
fetch_date: "YYYY-MM-DD"
translation_status: none
---
# Zero-shot Prompting
[원본 링크](https://www.promptingguide.ai/techniques/zeroshot)
## 본문
(수집된 콘텐츠)
3. 마크다운 파일 생성
일반 문서 (웹, GitHub)
---
title: "문서 제목"
source_url: "https://..."
source_type: web | github
author: "저자명"
fetch_date: "YYYY-MM-DD"
translation_status: none
---
# 문서 제목
[원본 링크](https://...)
## 본문
(수집된 콘텐츠)
YouTube 영상 (챕터가 있는 경우 - 디렉토리 구조)
챕터가 있는 YouTube 영상은 자동으로 디렉토리 구조로 분리됩니다.
인덱스 파일 (docs/week{N}/{slug}/eng/_index.md):
---
title: "영상 제목"
source_url: "https://youtube.com/..."
source_type: youtube_transcript
author: "채널명"
duration: "3:31:05"
fetch_date: "YYYY-MM-DD"
translation_status: none
chapters: 24
is_parent: true
---
# 영상 제목
[원본 영상](https://youtube.com/...)
## 개요
이 영상은 LLM의 핵심 개념을 다루는 3시간 31분 분량의 강의입니다.
## 챕터 목록
| # | 챕터 | 길이 | 파일 |
|---|------|------|------|
| 1 | [Introduction](./introduction.md) | 0:00 - 1:00 | introduction.md |
| 2 | [Pretraining Data](./pretraining-data.md) | 1:00 - 7:47 | pretraining-data.md |
| 3 | [Tokenization](./tokenization.md) | 7:47 - 15:23 | tokenization.md |
...
챕터별 파일 (docs/week{N}/{slug}/eng/{childSlug}.md):
---
title: "1. Introduction"
parent_title: "영상 제목"
parent_slug: "{slug}"
chapter: 1
timestamp: "0:00"
end_timestamp: "1:00"
source_url: "https://youtube.com/...&t=0s"
source_type: youtube_chapter
author: "채널명"
fetch_date: "YYYY-MM-DD"
translation_status: none
---
# 1. Introduction
[영상 바로가기 (0:00)](https://youtube.com/...&t=0s) | [← 목록으로](./_index.md)
**요약**: ChatGPT와 같은 대규모 언어 모델에 대한 포괄적인 소개...
---
[0:00] hi everyone so I've wanted to make this video for a while...
[0:30] what should we be putting there and what are these words...
[0:55] let's dive in...
YouTube 영상 (챕터가 없는 경우 - 단일 파일)
---
title: "영상 제목"
source_url: "https://youtube.com/..."
source_type: youtube_transcript
author: "채널명"
duration: "15:30"
fetch_date: "YYYY-MM-DD"
translation_status: none
---
# 영상 제목
[원본 영상](https://youtube.com/...)
## 본문
[0:00] hi everyone...
[0:30] in this video...
PDF 문서 (페이지별 구조)
---
title: "문서 제목"
source_url: "https://..."
source_type: pdf
author: "저자명"
fetch_date: "YYYY-MM-DD"
translation_status: none
total_pages: 5
meaningful_pages: 4
---
# 문서 제목
[원본 링크](https://...)
---
## Page 1
(페이지 1 정제된 콘텐츠)
---
## Page 2
(페이지 2 정제된 콘텐츠)
---
## Page 3
(페이지 3 정제된 콘텐츠)
---
## Contents
| Page | Summary |
|------|---------|
| 1 | 소개 및 개요 |
| 2 | Use Case 1: 코드 이해 |
| 3 | Use Case 2: 리팩터링 |
4. 파일 저장
모든 콘텐츠는 폴더 구조로 저장됩니다 (eng/kr 분리):
단일 페이지 (일반 문서, 챕터 없는 YouTube):
- 경로:
docs/week{N}/{slug}/eng/index.md
YouTube 자동 분리 (챕터가 있는 경우):
- 디렉토리:
docs/week{N}/{slug}/eng/ - 인덱스:
docs/week{N}/{slug}/eng/_index.md - 챕터:
docs/week{N}/{slug}/eng/{childSlug}.md
계층적 구조 (--parent, --child 사용 시 또는 웹 하위페이지):
- 경로:
docs/week{N}/{parent-slug}/eng/{child-slug}.md - 부모 디렉토리가 없으면 자동 생성
예시:
# 단일 페이지 (일반 문서)
docs/week1/how-openai-uses-codex/
├── eng/
│ └── index.md # 원본
└── kr/ # 번역 시 생성
└── index.md
# YouTube 자동 분리 (챕터 있음)
docs/week1/deep-dive-llms/
├── eng/
│ ├── _index.md # 인덱스 (개요 + 목차)
│ ├── introduction.md # 챕터 1
│ ├── pretraining-data.md # 챕터 2
│ ├── tokenization.md # 챕터 3
│ └── ... (24개 챕터)
└── kr/ # 번역 시 생성
├── _index.md
├── introduction.md
└── ...
# 웹 하위페이지 / 수동 계층적 구조
docs/week1/prompt-engineering-guide/
├── eng/
│ ├── zeroshot.md
│ ├── fewshot.md
│ └── cot.md
└── kr/ # 번역 시 생성
├── zeroshot.md
└── fewshot.md
- 기존 파일이 있으면 덮어쓰기 전 확인
5. INDEX.md 업데이트
docs/week{N}/INDEX.md의 수집 상태 업데이트docs/INDEX.md의 통계 업데이트
예시
단일 페이지 수집
웹 문서:
/fetch-reading https://stytch.com/blog/model-context-protocol-introduction/
결과: docs/week2/mcp-introduction/eng/index.md 생성
PDF (로컬):
/fetch-reading how-openai-uses-codex.pdf
결과: docs/week1/how-openai-uses-codex/eng/index.md 생성
Week 지정:
/fetch-reading https://some-url.com/article --week 3
결과: docs/week3/{slug}/eng/index.md 에 저장
웹 하위 페이지 자동 수집
하위 페이지가 있는 웹 문서:
/fetch-reading https://www.promptingguide.ai/techniques
동작:
- 메인 페이지에서 하위 페이지 링크 자동 탐색
- 발견된 하위 페이지 목록 표시 (예: zeroshot, fewshot, cot...)
- AskUserQuestion으로 사용자 확인
- 승인 시 모든 하위 페이지를
docs/week1/prompt-engineering-guide/eng/구조로 저장
결과:
docs/week1/prompt-engineering-guide/
├── eng/
│ ├── zeroshot.md
│ ├── fewshot.md
│ ├── cot.md
│ └── ... (자동 탐색된 하위 페이지들)
└── kr/ # 번역 시 생성
계층적 구조 수동 수집 (부모-자식)
자동 탐색을 사용하지 않고 수동으로 개별 페이지를 지정하는 경우:
자식 페이지 수집:
/fetch-reading https://www.promptingguide.ai/techniques/zeroshot --week 1 --parent prompt-engineering-guide --child zeroshot
결과: docs/week1/prompt-engineering-guide/eng/zeroshot.md 생성
여러 자식 순차 수집:
/fetch-reading https://www.promptingguide.ai/techniques/fewshot --week 1 --parent prompt-engineering-guide --child fewshot
/fetch-reading https://www.promptingguide.ai/techniques/cot --week 1 --parent prompt-engineering-guide --child cot
결과: docs/week1/prompt-engineering-guide/eng/ 디렉토리에 각각 저장
참고 파일
src/content/syllabus.ts: URL-Week 매핑docs/INDEX.md: 전체 진행 상황docs/week{N}/INDEX.md: 주차별 상세
출력
수집 완료 후 표시:
- 생성된 파일 경로
- 콘텐츠 길이 (글자 수)
- 다음 단계 안내
단일 페이지 완료 메시지
✅ Reading 수집 완료!
📄 파일: docs/week1/how-openai-uses-codex/eng/index.md
📊 콘텐츠: 5,432자
🔗 원본: https://...
다음 단계:
/translate-reading week1/how-openai-uses-codex
YouTube 챕터별 완료 메시지
✅ YouTube 영상 수집 완료! (챕터별 분리)
📁 디렉토리: docs/week1/deep-dive-llms/eng/
📊 챕터 수: 24개
⏱️ 영상 길이: 3:31:05
생성된 파일:
- eng/_index.md (인덱스)
- eng/introduction.md (0:00)
- eng/pretraining-data.md (1:00)
- eng/tokenization.md (7:47)
... (21개 더)
다음 단계:
# 전체 챕터 번역 (순차 실행)
/translate-reading week1/deep-dive-llms/introduction
/translate-reading week1/deep-dive-llms/pretraining-data
...
# 또는 특정 챕터만 번역
/translate-reading week1/deep-dive-llms/tokenization
웹 하위 페이지 완료 메시지
✅ 웹 문서 수집 완료! (하위 페이지 자동 탐색)
📁 디렉토리: docs/week1/prompt-engineering-guide/eng/
📊 하위 페이지: 18개
🔗 원본: https://www.promptingguide.ai/techniques
생성된 파일:
- eng/zeroshot.md (Zero-shot Prompting)
- eng/fewshot.md (Few-shot Prompting)
- eng/cot.md (Chain-of-Thought Prompting)
- eng/self-consistency.md (Self-Consistency)
... (14개 더)
다음 단계:
# 전체 하위 페이지 번역 (순차 실행)
/translate-reading week1/prompt-engineering-guide/zeroshot
/translate-reading week1/prompt-engineering-guide/fewshot
...
# 또는 특정 페이지만 번역
/translate-reading week1/prompt-engineering-guide/cot