# Source Adapter Book

> 책 원고(.md 또는 .hwpx)에서 카드뉴스 8장 시리즈 초안을 뽑아 공통 스키마 card_script.json 으로 정규화한다. 문단·제목·인용문을 분석해 훅-본문-인용-CTA 구조로 배치한다. 사용자가 책/챕터/단행본 원고를 카드뉴스로 바꾸려 할 때 사용.

- Skill: `leedonwoo2827-ship-it/source-adapter-book` (Agent Skill)
- Install (CLI): `npx skillmds@latest add leedonwoo2827-ship-it/source-adapter-book`
- Raw SKILL.md: https://api.skillmd.com/api/skills/leedonwoo2827-ship-it/source-adapter-book/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: leedonwoo2827-ship-it (https://skillmd.com/u/leedonwoo2827-ship-it)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/leedonwoo2827-ship-it/source-adapter-book

---


# 책 원고 → card_script.json 어댑터

책의 한 챕터 또는 전체 원고를 Instagram 8장 카드뉴스 초안으로 변환한다.

## 입력

- `workspace/<slug>/source/<file>.md` 또는 `.hwpx` (ingest 시 복사된 스냅샷)
- `workspace/<slug>/_ingest_report.json`
- `channels/instagram/profile.json` (글자수 제한, 팔레트)

## 처리 단계

### 1. 텍스트 추출

- `.md` → 그대로 읽기
- `.hwpx` → MCP 서버의 `analyze_source` 툴에 위임 (내부적으로 `hwpx_writer` 계열 파서 사용)

### 2. 구조 분해

- **제목 추출**: 첫 `# ` 헤더 → `series_title`, 두 번째 헤더나 부제 → `series_subtitle`
- **섹션 분할**: `## ` 또는 `### ` 단위로 분절
- **핵심 문장 추출**: 각 섹션의 첫 문장 또는 가장 짧은 주장성 문장
- **인용문**: `> ...` 블록 → `role: quote` 카드 후보
- **숫자/연도 포함 문장**: "1840년", "35%" 같은 패턴 → `role: evidence` 후보

### 3. 카드 배치 (8장 기본)

기본 매트릭스 (knowledge/visual-archetype-library.md 참조):

| n | role | template | 내용 소스 |
|---|---|---|---|
| 1 | hook | photo-overlay | 가장 강한 주장·질문·숫자 1개 |
| 2 | body | typo-minimal | 첫 섹션 핵심 문장 |
| 3 | quote | typo-minimal | `>` 블록 중 가장 인상적인 것 (없으면 body로 폴백) |
| 4 | body | typo-minimal | 두 번째 섹션 핵심 |
| 5 | evidence | typo-minimal | 숫자·연도 포함 문장 |
| 6 | body | typo-minimal | 세 번째 섹션 핵심 |
| 7 | body | typo-minimal | 네 번째 섹션 핵심 또는 결론 |
| 8 | cta | typo-minimal | "저장하고 다시 보기 📌" 기본 CTA |

섹션이 4개 미만이면 카드 수를 6장으로 축소. 10개 이상이면 10장 상한.

### 4. 이미지 프롬프트 생성 (Card 1만)

- Card 1 의 `image_prompt` 필드에 영문 프롬프트 자동 생성
- 패턴: `{theme_noun}, {era/mood}, editorial photography, minimal composition, sepia tone`
- 예: 책이 "원격교육의 역사"면 → `"victorian era postal worker delivering letters, editorial photography, minimal composition, sepia tone"`
- Card 2~7 의 `image_prompt` 는 기본 `null` (사용자가 편집 단계에서 채움)

### 5. 캡션·해시태그

- `caption`: 첫 125자 = Card 1 headline+body 요약, 이후 "스와이프해서 보기 →" + Card 8 CTA 재진술 + 시리즈 맥락 2~3줄
- `hashtags`: 책 주제에서 6~8개 추출. 예: `["#책소개", "#북스타그램", "#독서", "#교육사", "#원격교육", "#1800년대", "#카드뉴스"]`

### 6. 팔레트

- source_type="book" 기본 프리셋 `sepia-cream` 적용
- 사용자 `--palette` 오버라이드 반영

## 산출

`workspace/<slug>/card_script.json` — `knowledge/card-script-schema.md` 스키마 엄수.

## 글자수 제약

- headline 권장 17자, strict_max 22자. 초과하면 경고 목록에 추가하되 그대로 저장
- body 권장 80자, strict_max 120자
- 사용자가 편집 단계에서 다듬는다는 전제

## 편집 포인트 안내

스킬 종료 시 목록 출력:
- 글자수 초과 카드
- `image_prompt` null 이지만 템플릿이 `photo-overlay` 로 설정된 카드 (일관성 문제)
- 인용문을 찾지 못해 Card 3 를 body 로 폴백했을 때

## 실패 조건

- 원고가 1000자 미만 → 카드뉴스로 분할할 내용 부족, 사용자에게 확인
- 제목(H1)이 없음 → 파일명을 `series_title` 로 폴백하고 경고

