---
name: fetch-reading
description: |
  URL에서 reading 콘텐츠를 수집하여 마크다운 파일로 저장합니다.
  YouTube, PDF, 웹 문서 지원. (GitHub/Notion 현재 보류)

  사용:
    /fetch-reading <url>              # 단일 URL 수집
    /fetch-reading week <N>           # Week N 전체 reading 수집 + 번역
arguments:
  - name: url
    description: 수집할 URL 또는 로컬 PDF 파일 경로 (단일 모드)
    required: false
  - name: week
    description: |
      Week 번호. 두 가지 사용법:
      1. 배치 모드: /fetch-reading week 2 (Week 2 전체 수집 + 번역)
      2. 단일 모드: /fetch-reading <url> --week 2 (저장 위치 지정)
    required: false
  - name: skip-translate
    description: 배치 모드에서 번역 단계 건너뛰기
    required: false
  - name: parent
    description: 부모 Reading slug (계층적 구조용, 예: prompt-engineering-guide)
    required: false
  - name: child
    description: 자식 페이지 slug (--parent와 함께 사용, 예: zeroshot)
    required: false
  - name: no-subpages
    description: 웹 문서의 하위 페이지 자동 탐색 건너뛰기
    required: false
---

# 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 배치 모드 실행 지침

1. **syllabus.ts에서 reading 목록 추출**:
   ```
   - src/content/syllabus.ts 파일 읽기
   - week.number === N인 주차 찾기
   - readings 배열에서 URL 추출
   ```

2. **수집 대상 필터링** (이미 수집된 콘텐츠는 자동 스킵):
   - `docs/week{N}/{slug}/eng/index.md` 또는 `eng/_index.md` 존재 시 "⏭️ 이미 수집됨"
   - GitHub/Notion URL은 "⏸️ 보류" 표시
   - 지원되지 않는 URL 형식은 "❌ 지원 안함" 표시

3. **사용자 확인**:
   먼저 수집 대상 목록을 테이블로 보여준 후 확인:

   ```
   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
   ```

4. **순차 fetch 실행**:
   각 reading에 대해 기존 fetch 로직 실행 (YouTube/PDF/웹)

5. **번역 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에 대해 동시 실행)
   ```

6. **결과 요약**:
   ```
   ✅ Week {N} 배치 처리 완료!

   📊 수집: {성공}/{전체}개 완료
   📝 번역: {성공}/{전체}개 진행중

   | Reading | 수집 | 번역 |
   |---------|------|------|
   | mcp-introduction | ✅ | 🔄 진행중 |
   | mcp-authentication | ✅ | 🔄 진행중 |
   | sample-mcp-servers | ⏸️ 스킵 (GitHub) | - |

   번역 상태 확인: /tasks 명령어로 background task 확인
   ```

---

### 단일 URL 모드 동작

`/fetch-reading <url>` 형식으로 호출된 경우의 동작 흐름입니다.

### 1. URL/파일 분석

1. 입력 유형 판별:
   - YouTube URL (`youtube.com`, `youtu.be`)
   - PDF URL (`.pdf` 확장자) 또는 로컬 PDF 파일
   - **⏸️ GitHub URL (`github.com`) - 보류**
   - **⏸️ Notion URL (`notion.so`, `notion.site`) - 보류**
   - 일반 웹 URL

2. **보류 소스 체크** (GitHub/Notion):
   - URL이 `github.com` 도메인이면 보류 메시지 표시 후 중단
   - URL이 `notion.so` 또는 `notion.site` 도메인이면 보류 메시지 표시 후 중단

3. Week 번호 결정:
   - `--week` 파라미터가 있으면 사용
   - 없으면 `src/content/syllabus.ts`에서 URL 매칭하여 추론

4. 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 처리 실행 지침

1. **메타데이터 추출**: yt-dlp로 영상 정보 가져오기
   ```bash
   yt-dlp --dump-json <URL>
   ```

2. **챕터 정보 확보**:
   - yt-dlp `chapters` 배열 확인
   - 없으면 `description`에서 타임스탬프 패턴 파싱 (예: `0:00`, `1:23:45`)
   - 둘 다 없으면 사용자에게 확인:
     ```
     이 영상에는 챕터가 없습니다. 어떻게 처리할까요?
     1. 수동으로 분할점 입력 (예: "10:00, 25:30, 45:00")
     2. 전체를 하나의 섹션으로 처리
     3. 시간 기준 자동 분할 (예: 10분 단위)
     ```

3. **자막 다운로드**:
   ```bash
   yt-dlp --write-subs --write-auto-subs \
     --sub-langs "en" --sub-format "vtt" \
     --skip-download \
     -o "docs/week{N}/{slug}/media/{slug}" \
     <URL>
   ```

4. **챕터별 자막 분할**: 각 챕터의 시작/종료 시간 기준으로 VTT 자막 분할

5. **챕터별 검증**: 각 챕터에 대해 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 검증"
   ```

6. **챕터별 파일 저장** (챕터가 있는 경우 자동 분리):

   챕터가 있으면 자동으로 디렉토리 구조를 생성합니다:

   ```
   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 배열:
```json
{
  "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 처리 실행 지침

1. **PDF 읽기**: Read 도구로 PDF 파일 전체 읽기
2. **페이지 분리**: `[Page N]` 마커를 기준으로 각 페이지 텍스트 분리
3. **페이지별 검증**: 각 페이지에 대해 Task tool 호출
   ```
   Task tool 호출:
   - subagent_type: "general-purpose"
   - prompt: ".claude/agents/fetch-reading/page-content-validator.md 에이전트 지침에 따라
             페이지 N의 텍스트를 검증하고 정제하세요.

             페이지 번호: N
             텍스트:
             (해당 페이지 텍스트)"
   - description: "PDF 페이지 N 검증"
   ```
4. **결과 병합**:
   - `has_meaningful_content: true`인 페이지만 `## Page N` 형태로 병합
   - `has_meaningful_content: false`인 페이지는 제외
5. **목차 생성**: 마지막에 각 페이지 요약으로 목차 생성

#### 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: "이 글의 전체 본문을 마크다운 형식으로 추출하세요.

  **절대 요약하지 마세요.** 모든 섹션, 모든 문단, 모든 코드 블록, 모든 표를 빠짐없이 포함하세요.

  다음 구조를 유지하세요:
  - 모든 헤딩(#, ##, ###) 그대로 보존
  - 코드 블록은 ```언어명으로 감싸서 보존
  - 표는 마크다운 테이블 형식으로 보존
  - 불릿 리스트와 번호 리스트 그대로 보존
  - 인용문은 > 형식으로 보존
  - 이미지는 ![alt](url) 형식으로 보존

  원문 그대로 전체를 출력하세요."
```

##### 웹 문서 처리 요약

- WebFetch로 HTML 수집 (전문 추출 prompt 필수)
- 본문 추출 및 마크다운 변환
- 코드 블록, 리스트, 헤딩 구조 보존
- **하위 페이지 자동 탐색**: 네비게이션/사이드바에서 하위 페이지 링크 감지

##### 웹 문서 하위 페이지 자동 탐색 워크플로우

웹 문서인 경우, 먼저 하위 페이지가 있는지 자동으로 탐색합니다.

**자동 탐색이 건너뛰어지는 경우**:
- `--no-subpages` 옵션 사용 시
- `--parent`와 `--child` 옵션으로 수동 지정 시
- PDF, GitHub, YouTube 등 웹 문서가 아닌 경우

```
웹 URL 입력
    │
    ▼
┌──────────────────────────────────────┐
│ WebFetch로 메인 페이지 HTML 수집       │
│ - 네비게이션/사이드바 링크 분석         │
│ - 같은 도메인의 하위 페이지 추출        │
│ - URL 패턴 분석 (예: /techniques/*)    │
└──────────────────────────────────────┘
    │
    ▼
┌──────────────────────────────────────┐
│ 하위 페이지 감지 여부 확인              │
│ - 감지됨: 사용자 확인 단계로             │
│ - 감지 안됨: 단일 페이지로 처리          │
└──────────────────────────────────────┘
    │
    ▼ (하위 페이지 감지됨)
┌──────────────────────────────────────┐
│ AskUserQuestion으로 사용자 확인        │
│ - 발견된 하위 페이지 목록 표시          │
│ - 전체 수집 / 선택 수집 / 단일 페이지   │
└──────────────────────────────────────┘
    │
    ▼ (사용자 승인)
┌──────────────────────────────────────┐
│ 각 하위 페이지 순차 수집               │
│ - 부모 디렉토리 생성                   │
│ - 각 하위 페이지 WebFetch로 수집       │
│ - 개별 마크다운 파일로 저장            │
└──────────────────────────────────────┘
```

##### 단일 웹 페이지 수집 실행 지침

하위 페이지가 없거나 `--no-subpages` 옵션 사용 시:

```
WebFetch 호출:
- url: {대상 URL}
- prompt: "이 글의 전체 본문을 마크다운 형식으로 추출하세요.

  **절대 요약하지 마세요.** 모든 섹션, 모든 문단, 모든 코드 블록, 모든 표를 빠짐없이 포함하세요.

  다음 구조를 유지하세요:
  - 모든 헤딩(#, ##, ###) 그대로 보존
  - 코드 블록은 ```언어명으로 감싸서 보존
  - 표는 마크다운 테이블 형식으로 보존
  - 불릿 리스트와 번호 리스트 그대로 보존
  - 인용문은 > 형식으로 보존
  - 이미지는 ![alt](url) 형식으로 보존

  원문 그대로 전체를 출력하세요."
```

결과를 `docs/week{N}/{slug}/eng/index.md`에 저장합니다.

##### 웹 하위 페이지 탐색 실행 지침

1. **메인 페이지 수집 및 분석**:
   ```
   WebFetch 호출 (하위 페이지 탐색용):
   - url: {대상 URL}
   - prompt: "이 페이지의 네비게이션/사이드바에서 하위 페이지 링크를 찾아주세요.
             같은 도메인 내의 관련 문서 링크들을 추출하세요.
             각 링크의 제목과 URL을 목록으로 알려주세요."

   분석 대상:
   - 사이드바/네비게이션 메뉴의 링크들
   - 같은 도메인 또는 같은 경로 패턴의 링크
   - "목차", "Table of Contents", "Chapters" 등의 섹션
   ```

2. **하위 페이지 링크 추출 기준**:
   - 같은 도메인 내의 링크만 대상
   - URL 패턴이 유사한 링크 그룹화 (예: `/techniques/zeroshot`, `/techniques/fewshot`)
   - 네비게이션/사이드바에 있는 링크 우선
   - 외부 링크, 앵커 링크(#), 이미지/미디어 링크 제외

3. **하위 페이지 감지 시 사용자 확인**:

   하위 페이지를 발견하면 **반드시** 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 |
   ...

   이 페이지들을 어떻게 처리할까요?
   ```

4. **전체 수집 선택 시**:
   - 부모 디렉토리 생성: `docs/week{N}/{parent-slug}/eng/`
   - 각 하위 페이지를 순차적으로 WebFetch (**전문 추출 prompt 필수**)
   - 개별 마크다운 파일로 저장: `docs/week{N}/{parent-slug}/eng/{child-slug}.md`
   - 하위 페이지의 slug는 URL 경로 또는 제목에서 생성

   **각 하위 페이지 수집 시 WebFetch 호출**:
   ```
   WebFetch 호출:
   - url: {하위 페이지 URL}
   - prompt: "이 글의 전체 본문을 마크다운 형식으로 추출하세요.

     **절대 요약하지 마세요.** 모든 섹션, 모든 문단, 모든 코드 블록, 모든 표를 빠짐없이 포함하세요.

     다음 구조를 유지하세요:
     - 모든 헤딩(#, ##, ###) 그대로 보존
     - 코드 블록은 ```언어명으로 감싸서 보존
     - 표는 마크다운 테이블 형식으로 보존
     - 불릿 리스트와 번호 리스트 그대로 보존
     - 인용문은 > 형식으로 보존

     원문 그대로 전체를 출력하세요."
   ```

5. **선택적 수집 선택 시**:
   - 추가 AskUserQuestion으로 수집할 페이지 선택 (multiSelect: true)
   - 선택된 페이지만 수집

##### 웹 하위 페이지 결과 구조

```
docs/week1/prompt-engineering-guide/
├── eng/                      # 원본 (영어)
│   ├── zeroshot.md           # 하위 페이지 1
│   ├── fewshot.md            # 하위 페이지 2
│   ├── cot.md                # 하위 페이지 3
│   ├── self-consistency.md   # 하위 페이지 4
│   └── ... (N개 하위 페이지)
└── kr/                       # 번역본 (번역 시 생성)
```

**개별 하위 페이지 파일 형식**:
```markdown
---
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)

```markdown
---
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`)**:

```markdown
---
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`)**:

```markdown
---
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 영상 (챕터가 없는 경우 - 단일 파일)

```markdown
---
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 문서 (페이지별 구조)

```markdown
---
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
```

동작:
1. 메인 페이지에서 하위 페이지 링크 자동 탐색
2. 발견된 하위 페이지 목록 표시 (예: zeroshot, fewshot, cot...)
3. AskUserQuestion으로 사용자 확인
4. 승인 시 모든 하위 페이지를 `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
```
