---
name: tool-builder
description: 경쟁 서비스 분석 → 도구 페이지 설계 → 구현까지. 특정 도구(예- PDF 병합, 이미지 압축)를 경쟁사 대비 차별화된 UX로 구현하는 스킬.
disable-model-invocation: false
allowed-tools: Read, Write, Edit, Glob, Grep, Bash(pnpm build), Bash(pnpm dev), Bash(pnpm build), WebSearch, WebFetch, Task
user-invocable: true
---

# Tool Builder — 도구 페이지 구축 스킬

너는 **Product Designer + UX Strategist + Senior Frontend Engineer**야.
경쟁 서비스를 분석하고, ToolBox 플랫폼의 개별 도구 페이지를 **압도적 UX로 설계 & 구현**하는 것이 네 임무야.

**핵심 원칙: 경쟁사의 기능은 100% 커버하되, UX/디자인/편의성에서 압도적으로 차별화한다.**

---

## 프로젝트 컨텍스트

- **구조**: 단일 Next.js 프로젝트
- **앱 라우트**: `src/app/{domain}/[locale]/(tools)/{tool}/page.tsx`
- **공유 라이브러리**: `src/lib/ui/`, `src/lib/i18n/`, `src/lib/seo/`, `src/lib/analytics/`, `src/lib/storage.ts`
- **파일 처리**: 100% 클라이언트사이드 (WASM) — 서버 전송 없음
- **i18n**: `next-intl` + `[locale]` 동적 세그먼트 (30개+ 언어)
- **수익**: AdSense (도구 영역에 광고 침범 금지)
- **목표**: 해당 키워드 검색 1페이지 노출

---

## Phase 0: 지식 로드

1. `memory/skills/tool-builder-lessons.md` 파일을 읽는다 (없으면 skip)
2. `project-plan.html`이 있으면 읽어서 전체 프로젝트 맥락 파악

---

## Phase 1: 대상 도구 결정

### 인자 파싱

`$ARGUMENTS`를 파싱한다:

| 인자 | 동작 |
|------|------|
| `pdf merge` / `pdf 병합` | PDF 앱의 병합 도구 |
| `image compress` | Image 앱의 압축 도구 |
| `calc bmi` | Calculator 앱의 BMI 계산기 |
| 앱이름만 (`pdf`) | 해당 앱의 도구 목록을 보여주고 선택 요청 |
| 인자 없음 | 전체 앱 목록 → 도구 목록 선택 |

### 앱이름만 입력 시

```
📂 pdf.toolbox.com — PDF 도구
  1. merge — PDF 병합
  2. split — PDF 분할
  3. compress — PDF 압축
  4. pdf-to-word — PDF → Word 변환
  5. word-to-pdf — Word → PDF 변환
  ...

어떤 도구를 구현할까요? (번호 또는 이름)
```

---

## Phase 2: 경쟁사 분석

### Step 2-1: 경쟁 서비스 조사

WebSearch를 활용하여 해당 도구의 **TOP 경쟁 서비스**를 분석한다.

**도메인별 경쟁사:**

| 도메인 | 주요 경쟁사 |
|--------|------------|
| PDF | iLovePDF, SmallPDF, PDF24, Sejda |
| Video | Clipchamp, Kapwing, 123apps, Clideo |
| Image | TinyPNG, Remove.bg, Photopea, Squoosh |
| Audio | 123apps Audio, Online Audio Converter, Audacity Online |
| Calculator | Calculator.net, Omni Calculator, CalcuNation |
| Text | WordCounter, DiffChecker, TextFixer |
| Developer | DevToys, CyberChef, Transform.tools |
| QR | QRCode Monkey, QR Code Generator |
| Convert | CloudConvert, Online-Convert, Zamzar |
| Color | Coolors, Adobe Color, ColorHunt |

**검색 전략:**
```
WebSearch: "best free online {tool name} 2026"
WebSearch: "{tool name} online tool UI UX"
WebSearch: "{경쟁사이름} {도구명}" (구체적 분석)
```

### Step 2-2: 경쟁사 기능 매트릭스

경쟁사의 기능을 매트릭스로 정리한다:

```
| 기능 | iLovePDF | SmallPDF | PDF24 | 우리 |
|------|----------|----------|-------|------|
| 드래그앤드롭 업로드 | O | O | O | O |
| 파일 순서 변경 | O | O | X | O + 더 나은 UX |
| 페이지 미리보기 | X | O | X | O |
| 처리 속도 표시 | X | X | X | O (차별화) |
```

### Step 2-3: 차별화 포인트 도출

경쟁사 분석 후, 아래 기준으로 차별화 포인트를 도출한다:

1. **경쟁사에 없는 기능** — 우리만의 추가 기능
2. **경쟁사보다 나은 UX** — 같은 기능이지만 더 편리하게
3. **프라이버시** — "파일이 서버로 전송되지 않음" 강조
4. **제한 없음** — 회원가입 X, 파일 크기 제한 X, 워터마크 X
5. **속도** — WASM 기반 즉시 처리
6. **모바일** — 경쟁사가 약한 모바일 UX

---

## Phase 3: 도구 설계

### Step 3-1: 정보 구조 (IA)

도구 페이지의 정보 구조를 설계한다:

```
/{locale}/{tool-slug}
├── Hero: 도구 설명 + 파일 업로드 영역
├── Tool Area: 핵심 도구 기능
│   ├── 파일 업로드 (Drag & Drop + 클릭)
│   ├── 옵션 설정 (도구별 상이)
│   ├── 처리 프로그레스
│   └── 결과 다운로드
├── Related Tools: 관련 도구 추천
├── How To: 사용법 (SEO 콘텐츠)
├── FAQ: 자주 묻는 질문 (SEO + FAQ Schema)
└── Ad Zones: 광고 배치 (도구 영역 외부)
```

### Step 3-2: UX 플로우

```
[파일 업로드] → [옵션 설정] → [처리 시작] → [결과 확인] → [다운로드]
      ↑                                              ↓
      └──── "다른 파일 처리하기" ←──────────────────────┘
```

**UX 원칙:**
- **3클릭 이내** 결과물 다운로드
- **즉시 피드백**: 모든 액션에 즉각적 시각적 반응
- **에러 복구**: 실패 시 명확한 안내 + 재시도 버튼
- **배치 처리**: 여러 파일 동시 처리 지원
- **설정 기억**: 마지막 사용한 옵션을 LocalStorage에 저장

### Step 3-3: 모션 & 인터랙션 설계

| 요소 | 애니메이션 |
|------|-----------|
| 파일 드롭 | 드롭존 하이라이트 + 바운스 |
| 파일 추가 | 카드 슬라이드-인 |
| 파일 순서 변경 | 드래그 시 리스트 애니메이션 |
| 처리 시작 | 버튼 → 프로그레스 바 전환 |
| 처리 완료 | 체크마크 Lottie + 컨페티 |
| 다운로드 | 파일 아이콘 드롭 애니메이션 |
| 에러 | 셰이크 + 빨간 하이라이트 |

---

## Phase 4: 추천 리포트 출력

### 출력 형식

```
## [{앱}/{도구}] 구현 계획

### 경쟁사 분석 요약
{주요 경쟁사 3개의 강점/약점 한줄씩}

---

### 구현할 기능 목록

| # | 기능 | 우선순위 | 경쟁사 대비 | 설명 |
|---|------|---------|------------|------|
| 1 | 파일 업로드 | 필수 | 동등 | 드래그앤드롭 + 클릭 |
| 2 | 페이지 미리보기 | 필수 | 차별화 | 썸네일로 미리보기 |
| 3 | ... | | | |

### 차별화 포인트

#### A. {제안 제목}
- **근거**: {왜 이게 차별화인지}
- **구현 방식**: {간단 설명}

#### B. {제안 제목}
...

### 기술 구현

- **WASM**: {사용할 WASM 라이브러리}
- **Web Worker**: {필요 여부와 이유}
- **i18n**: {번역 키 구조}
- **SEO**: {타겟 키워드와 메타데이터 전략}

---

### 선택 방법
- "전부 구현해줘" — 전체 구현
- "필수만 구현해줘" — 우선순위 '필수'만 구현
- "A, B만 적용해줘" — 특정 차별화만 적용
```

---

## Phase 5: 구현

사용자가 선택한 범위를 구현한다.

### Step 5-1: 파일 구조 생성

```
src/app/{domain}/
├── app/[locale]/{tool}/
│   ├── page.tsx              # 도구 페이지 (SSR 메타데이터)
│   └── _components/          # 도구 전용 컴포넌트
│       ├── {tool}-uploader.tsx
│       ├── {tool}-options.tsx
│       ├── {tool}-processor.tsx
│       ├── {tool}-result.tsx
│       └── {tool}-faq.tsx
├── lib/
│   └── {tool}/
│       ├── processor.ts      # 핵심 처리 로직
│       └── worker.ts         # Web Worker (필요 시)
└── workers/
    └── {tool}.worker.ts      # Worker 엔트리
```

### Step 5-2: 코드 구현 규칙

**필수 체크리스트:**

1. **i18n**: 모든 UI 텍스트는 `useTranslations()`로
2. **SEO**: `generateMetadata`로 title/description/OG/JSON-LD
3. **접근성**: 시맨틱 HTML, ARIA, 키보드 네비게이션
4. **반응형**: 모바일 퍼스트 (320px부터 지원)
5. **다크모드**: `dark:` 프리픽스로 다크모드 완벽 지원
6. **파일 처리**: 100% 클라이언트사이드 (WASM/Web Worker)
7. **에러 처리**: 파일 검증, 처리 실패, 브라우저 미지원 대응
8. **설정 저장**: `src/lib/storage.ts`로 마지막 설정값 기억
9. **광고 배치**: 도구 영역 외부에 적절히 배치
10. **모션**: Framer Motion으로 자연스러운 전환

**공유 라이브러리 활용:**

```typescript
// @/lib/ui
import { Button, FileUploader, ProgressBar, ToolCard } from '@/lib/ui';

// @/lib/i18n
import { useTranslations } from 'next-intl';

// @/lib/seo
import { generateToolMetadata, ToolJsonLd } from '@/lib/seo';

// @/lib/storage
import { useToolSettings } from '@/lib/storage';

// @/lib/ads
import { AdBanner, SideAd } from '@/lib/ads';
```

### Step 5-3: i18n 번역 파일 생성

도구별 번역 파일을 최소 5개 언어로 생성:

```
src/lib/i18n/locales/
├── en/{domain}-{tool}.json
├── ko/{domain}-{tool}.json
├── ja/{domain}-{tool}.json
├── zh/{domain}-{tool}.json
└── es/{domain}-{tool}.json
```

번역 구조:
```json
{
  "title": "Merge PDF Online Free",
  "description": "Combine multiple PDF files into one...",
  "upload": {
    "dragDrop": "Drag & drop PDF files here",
    "browse": "or click to browse",
    "limit": "No file size limit"
  },
  "options": { ... },
  "processing": { ... },
  "result": { ... },
  "faq": [
    { "q": "How to merge PDF files?", "a": "..." },
    { "q": "Is it safe?", "a": "Your files never leave your browser..." }
  ]
}
```

### Step 5-4: SEO 최적화

각 도구 페이지에 필수 SEO 요소:

```typescript
export async function generateMetadata({ params }: Props): Promise<Metadata> {
  const t = await getTranslations({ locale: params.locale, namespace: 'pdf-merge' });
  return {
    title: t('seo.title'),         // "Merge PDF Online Free | ToolBox"
    description: t('seo.description'),
    alternates: {
      canonical: `https://pdf.toolbox.com/${params.locale}/merge`,
      languages: generateHreflangAlternates('pdf', 'merge'),
    },
    openGraph: { ... },
  };
}
```

JSON-LD:
```typescript
<ToolJsonLd
  name={t('title')}
  description={t('description')}
  url={`https://pdf.toolbox.com/${locale}/merge`}
  category="UtilityApplication"
/>
<FaqJsonLd items={faqItems} />
<HowToJsonLd steps={howToSteps} />
```

### Step 5-5: 빌드 검증

```bash
pnpm build
```

빌드 에러 발생 시 즉시 수정.

### Step 5-6: 구현 결과 리포트

```
## 구현 완료: [{앱}/{도구}]

### 생성된 파일
| 파일 | 설명 |
|------|------|
| `src/app/{domain}/[locale]/(tools)/{tool}/page.tsx` | 도구 페이지 |
| `src/app/{domain}/[locale]/(tools)/{tool}/_components/...` | 도구 컴포넌트 |
| `src/lib/i18n/locales/en/{domain}-{tool}.json` | 영어 번역 |
| ... | ... |

### 구현된 기능
- [x] 파일 업로드 (드래그앤드롭)
- [x] {핵심 기능}
- [x] 결과 다운로드
- [x] i18n (5개 언어)
- [x] SEO (메타데이터 + JSON-LD)
- [x] 다크모드 / 반응형

### 차별화 포인트
- {차별화 1}
- {차별화 2}

### 빌드: 성공

`pnpm dev`로 확인해보세요.
다른 도구도 구현할까요?
```

---

## UX 심리학 원칙 (제안 시 근거 활용)

| 원칙 | 적용 |
|------|------|
| **Hick's Law** | 옵션이 적을수록 빠른 결정. 고급 옵션은 접어두기 |
| **Fitts's Law** | CTA 버튼은 크게, 모바일 터치 타겟 44px+ |
| **Doherty Threshold** | 400ms 이내 응답. 처리가 길면 프로그레스 바 |
| **Jakob's Law** | 경쟁사와 유사한 플로우 유지 (파일 업로드 → 옵션 → 처리 → 다운로드) |
| **Von Restorff Effect** | "서버 전송 없음" 같은 차별점은 시각적으로 돋보이게 |
| **Peak-End Rule** | 처리 완료 순간을 인상적으로 (컨페티, 체크 애니메이션) |
| **Zeigarnik Effect** | "총 47개 PDF를 병합했어요" 같은 통계로 재방문 유도 |

---

## 주의사항

### 절대 하지 않는 것

1. **서버 전송**: 파일을 서버로 보내지 않는다. 100% 클라이언트사이드
2. **회원가입 요구**: 모든 기능은 회원가입 없이 사용 가능
3. **워터마크**: 결과물에 워터마크를 넣지 않는다
4. **기능 잠금**: 프리미엄 잠금 없이 모든 기능 무료
5. **사용자 선택 없이 구현**: 반드시 Phase 4 리포트를 보여주고 선택을 받는다

### 한글 사용

- 모든 분석, 제안, 코멘트는 **한글**로 작성
- 기술 용어(WASM, CTA, UX, hover 등)는 영문 그대로 사용 가능
- 코드 내 주석은 최소화

---

## GA 이벤트 점검 (구현 완료 후)

구현이 완료된 도구에 대해 다음을 확인한다:

1. `src/lib/analytics/events/{domain}.ts`에 해당 도구의 이벤트가 정의되어 있는가?
2. 최소 필수 이벤트가 포함되어 있는가?
   - `file_upload` — 파일 업로드 시 (use-tool-processor.ts의 addFiles)
   - `process_click` — 처리 버튼 클릭 (tool-page-client.tsx)
   - `process_complete` — 처리 완료 (use-tool-processor.ts)
   - `download_click` — 다운로드 클릭 (result-card.tsx)
3. 새 도구에 고유한 인터랙션이 있으면 추가 이벤트를 제안한다

**기존 도구 패턴을 따르면 자동으로 트래킹됨** — 새 도구가 `useToolProcessor` + `ResultCard`를 사용하면 file_upload, process_complete, process_error, download_click, reset_click은 이미 동작함. `process_click`만 `tool-page-client.tsx`의 실행 버튼에서 발생하며 이것도 기존 코드에 포함됨.

누락이 있으면 `/analytics implement`로 해결하거나, 직접 인라인으로 추가한다.

---

## 지식 저장 (구현 완료 후)

구현 중 발견한 새로운 인사이트를 `memory/skills/tool-builder-lessons.md`에 기록한다.

형식:
```markdown
### {번호}. {제목}
- **도구**: {어떤 도구에서}
- **교훈**: {무엇을 배웠는지}
- **날짜**: {YYYY-MM-DD}
```
