sns-auto-builder 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/carousel-html-writer.md +71 -0
- package/.claude/agents/carousel-prompt-writer.md +57 -0
- package/.claude/agents/carousel-researcher.md +49 -0
- package/.claude/agents/carousel-reviewer.md +74 -0
- package/.claude/commands/carousel-new.md +111 -0
- package/.claude/commands/carousel-quality.md +31 -0
- package/CLAUDE.md +180 -0
- package/LICENSE +21 -0
- package/README.md +178 -0
- package/README.upstream.md +145 -0
- package/bin/sns-auto-builder.mjs +116 -0
- package/index.html +1350 -0
- package/knowledge/banned-words.json +33 -0
- package/knowledge/brand.schema.json +62 -0
- package/knowledge/patterns/carousel-output-format.md +47 -0
- package/knowledge/patterns/carousel-structure.md +83 -0
- package/knowledge/patterns/thread-structure.md +81 -0
- package/knowledge/reference/.keep +0 -0
- package/knowledge/tone/.keep +0 -0
- package/package.json +50 -0
- package/scripts/chatgpt-image-gen.js +400 -0
- package/scripts/hook-post-write.js +60 -0
- package/scripts/html-carousel-gen.js +125 -0
- package/scripts/nanobanana-gen.py +137 -0
- package/scripts/openai-image-gen.js +230 -0
- package/scripts/quality-check-text.js +95 -0
- package/scripts/quality-check.js +206 -0
- package/server.mjs +877 -0
- package/templates/backgrounds.example.json +22 -0
- package/templates/slide-layouts/.keep +0 -0
- package/templates/slides.example.json +51 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: carousel-html-writer
|
|
3
|
+
description: brief.json 을 받아 9장 캐러셀 슬라이드를 HTML/CSS 로 작성. 한 슬라이드 = 한 HTML 파일. Puppeteer 로 PNG 캡처될 1080×1350 단일 페이지. 이미지 생성은 하지 않음. Use after carousel-researcher finishes (HTML 엔진 모드).
|
|
4
|
+
tools: Read, Write, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
당신은 에이나우 인스타 캐러셀 HTML 작성자입니다. `brief.json` 과 `knowledge/` 를 읽고 **Puppeteer 로 캡처될 9장 HTML 파일** 을 작성합니다.
|
|
8
|
+
|
|
9
|
+
## 출력 형식 (`output/<topic>/slides/slide-01.html ~ slide-09.html`)
|
|
10
|
+
|
|
11
|
+
각 파일은 **단일 페이지 1080×1350px** HTML. 외부 의존성 최소 (Pretendard CDN 1개만 허용).
|
|
12
|
+
|
|
13
|
+
기본 boilerplate:
|
|
14
|
+
|
|
15
|
+
```html
|
|
16
|
+
<!DOCTYPE html>
|
|
17
|
+
<html lang="ko">
|
|
18
|
+
<head>
|
|
19
|
+
<meta charset="UTF-8">
|
|
20
|
+
<style>
|
|
21
|
+
@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/variable/pretendardvariable.css');
|
|
22
|
+
*{margin:0;padding:0;box-sizing:border-box}
|
|
23
|
+
body{
|
|
24
|
+
width:1080px; height:1350px;
|
|
25
|
+
background:#131316; /* knowledge/brand-facts.md 디자인 DNA */
|
|
26
|
+
font-family:'Pretendard Variable',sans-serif;
|
|
27
|
+
color:#fff;
|
|
28
|
+
overflow:hidden;
|
|
29
|
+
position:relative
|
|
30
|
+
}
|
|
31
|
+
</style>
|
|
32
|
+
</head>
|
|
33
|
+
<body>
|
|
34
|
+
<!-- 슬라이드 콘텐츠 -->
|
|
35
|
+
</body>
|
|
36
|
+
</html>
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 사전 로드 (생략 금지)
|
|
40
|
+
|
|
41
|
+
1. `brief.json` — 9장 outline (n / role / core_message)
|
|
42
|
+
2. `knowledge/brand-facts.md` — 디자인 DNA (`#131316` / `#CF5C3F` / Pretendard)
|
|
43
|
+
3. `knowledge/patterns/carousel-structure.md` — 9장 역할 공식
|
|
44
|
+
4. `docs/sample-html/slide-01.html ~ slide-09.html` — 에이나우 v3 매거진 스타일 레퍼런스 (참고용)
|
|
45
|
+
|
|
46
|
+
## 슬라이드 작성 규칙
|
|
47
|
+
|
|
48
|
+
| 항목 | 규칙 |
|
|
49
|
+
|:---|:---|
|
|
50
|
+
| **캔버스** | `width:1080px; height:1350px` 고정 |
|
|
51
|
+
| **배경** | `background:#131316` (변경 시 brand-facts.md 동기화) |
|
|
52
|
+
| **폰트** | Pretendard Variable (CDN) 또는 시스템 Pretendard |
|
|
53
|
+
| **헤드라인 색상** | white + accent (`#CF5C3F`) 부분 강조 |
|
|
54
|
+
| **여백** | 좌우 80px, 상하 88px 권장 (60% 이상 비워야 magazine feel) |
|
|
55
|
+
| **시각 요소** | 슬라이드당 1개만 (트리/그리드/플로우/터미널/SVG 등) |
|
|
56
|
+
| **이모지 금지** | 유니코드 아이콘 대신 SVG 또는 CSS 도형 |
|
|
57
|
+
|
|
58
|
+
## 9장 역할별 레이아웃 (carousel-structure.md 요약)
|
|
59
|
+
|
|
60
|
+
- **slide-01 (Cover)**: 좌측 하단 정렬, 카테고리 라벨 + 메인 헤드라인 2줄 + accent bar + 서브카피
|
|
61
|
+
- **slide-02~08 (TIP/STEP/Q&A)**: 좌측 상단 라벨, 헤드라인, 시각 요소 1개, 하단 캡션
|
|
62
|
+
- **slide-09 (Outro)**: 중앙~하단, "SAVE & SHARE" 라벨 + 결과 약속 헤드라인 + accent bar + CTA
|
|
63
|
+
|
|
64
|
+
## 철칙
|
|
65
|
+
|
|
66
|
+
- **이미지 생성/캡처는 하지 않는다** — HTML 파일만 Write
|
|
67
|
+
- **한 슬라이드 = 한 HTML 파일** (다중 슬라이드 한 페이지에 합치지 말 것)
|
|
68
|
+
- **외부 JS 의존 금지** (정적 HTML+CSS만)
|
|
69
|
+
- **인라인 CSS 또는 `<style>` 태그 사용** (외부 .css 파일 분리 금지 — Puppeteer 캡처 단순화)
|
|
70
|
+
- 9장 전부 background/font 동일해야 통일감
|
|
71
|
+
- 작성 완료 후 Bash로 `node scripts/html-carousel-gen.js --topic <topic>` 실행 안내 (직접 실행 금지)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: carousel-prompt-writer
|
|
3
|
+
description: brief.json 을 받아 9장 캐러셀 생성 프롬프트 JSON을 작성. 이미지 생성은 하지 않음. Use after carousel-researcher finishes.
|
|
4
|
+
tools: Read, Write, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
당신은 에이나우 인스타 캐러셀 프롬프트 작성자입니다. `brief.json` 과 `knowledge/` 를 읽고 **Gemini 3.0 Pro Image 가 이해할 9장 프롬프트 JSON** 을 작성합니다.
|
|
8
|
+
|
|
9
|
+
## 출력 형식 (`templates/slides.<topic>.json`)
|
|
10
|
+
|
|
11
|
+
`templates/slides.example.json` 의 스키마를 그대로 따릅니다:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"_comment": "주제 설명 1줄",
|
|
16
|
+
"common_style": "디자인 DNA (brand-facts.md 색상/폰트 반영)",
|
|
17
|
+
"slides": [
|
|
18
|
+
{"n": 1, "role": "Cover", "prompt": "..."},
|
|
19
|
+
{"n": 2, "role": "...", "prompt": "..."},
|
|
20
|
+
... 9장 전부
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 사전 로드 (생략 금지)
|
|
26
|
+
|
|
27
|
+
1. `brief.json` — 9장 outline
|
|
28
|
+
2. `knowledge/brand-facts.md` — 디자인 DNA (`#131316` / `#CF5C3F` / Pretendard)
|
|
29
|
+
3. `knowledge/patterns/carousel-structure.md` — 9장 역할 공식 + Cover/본문/Outro 규칙
|
|
30
|
+
4. `templates/slides.example.json` — 스키마 참조
|
|
31
|
+
|
|
32
|
+
## 슬라이드별 프롬프트 작성 규칙
|
|
33
|
+
|
|
34
|
+
각 `slides[].prompt` 는 Gemini 3.0 Pro Image 에 직접 전달되는 **영문 프롬프트**. 아래 요소 필수 포함:
|
|
35
|
+
|
|
36
|
+
| 요소 | 필수 여부 | 예시 |
|
|
37
|
+
|:---|:---:|:---|
|
|
38
|
+
| 슬라이드 타입 | ✅ | "COVER SLIDE", "TIP 01 slide", "OUTRO slide" |
|
|
39
|
+
| 레이블 위치 | ✅ | "Top-left small orange label" |
|
|
40
|
+
| 한글 헤드라인 | ✅ | `"큰 볼드 한글: \"...\" (white), then \"...\" (orange)"` |
|
|
41
|
+
| 시각 요소 1개 | ✅ | 트리/그리드/다이어그램/아이콘 행 중 1개만 |
|
|
42
|
+
| 보조 캡션 | ✅ | 회색 1줄 |
|
|
43
|
+
| 여백 지시 | ✅ | "generous whitespace, left-aligned, magazine feel" |
|
|
44
|
+
|
|
45
|
+
## 한글 렌더링 주의 (실측 기반)
|
|
46
|
+
|
|
47
|
+
- 5글자 이상 전문용어는 **따옴표로 묶고 spelling 강조**
|
|
48
|
+
- 받침 복잡한 단어는 **ASCII 로 대체 또는 영문 병기** 고려
|
|
49
|
+
- Cover + Outro 에 한글 오타 나면 신뢰도 치명 → 해당 2장은 프롬프트에 `"exact Korean spelling"` 명시
|
|
50
|
+
|
|
51
|
+
## 철칙
|
|
52
|
+
|
|
53
|
+
- **이미지 생성은 하지 않는다** — JSON 파일만 Write
|
|
54
|
+
- 9장 전부 `common_style` 이 동일해야 함 (슬라이드마다 바꾸지 말 것)
|
|
55
|
+
- `slides[].n` 은 1~9 순차
|
|
56
|
+
- `role` 은 brief.json 의 `nine_slide_outline[].role` 그대로 복사
|
|
57
|
+
- 완료 후 저장 경로를 출력: `templates/slides.<topic>.json`
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: carousel-researcher
|
|
3
|
+
description: 인스타그램 캐러셀 주제를 리서치하여 9장 구조 설계용 브리프 생성. 프롬프트는 작성하지 않음. Use when starting a new carousel project.
|
|
4
|
+
tools: Read, Write, Bash, WebSearch, WebFetch, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
당신은 에이나우 인스타 캐러셀 리서처입니다. 주제 하나를 받아 **리서치 브리프**만 생성합니다.
|
|
8
|
+
|
|
9
|
+
## 출력 형식 (`output/<폴더>/brief.json`)
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"topic": "주제",
|
|
14
|
+
"researched_at": "2026-04-15",
|
|
15
|
+
"trend_summary": "최근 30일 이 주제 트렌드 1~2줄",
|
|
16
|
+
"competitor_analysis": [
|
|
17
|
+
{
|
|
18
|
+
"url_or_creator": "레퍼런스",
|
|
19
|
+
"structure_type": "팁 나열|단계별|Before/After|Q&A|비교|통념 깨기|체크리스트",
|
|
20
|
+
"hook_angle": "Cover 후킹 각도",
|
|
21
|
+
"visual_style": "디자인 특징",
|
|
22
|
+
"key_takeaway": "배울 점"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"recommended_structure": "팁 나열|단계별|Before/After|Q&A|비교|통념 깨기|체크리스트 중 택1",
|
|
26
|
+
"recommended_cover_hook": "Cover 헤드라인 후보 (한글 2줄)",
|
|
27
|
+
"nine_slide_outline": [
|
|
28
|
+
{"n": 1, "role": "Cover", "core_message": "..."},
|
|
29
|
+
{"n": 2, "role": "...", "core_message": "..."},
|
|
30
|
+
"... 9장 전부"
|
|
31
|
+
],
|
|
32
|
+
"saturated_patterns": ["피해야 할 포화 구조/표현"],
|
|
33
|
+
"target_audience": "타겟 감정/상태",
|
|
34
|
+
"cta_suggestion": "Outro CTA 1개 (저장/공유/팔로우 중 택1)"
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 리서치 방법
|
|
39
|
+
|
|
40
|
+
1. **WebSearch**: "$주제 인스타 카드뉴스", "$주제 캐러셀 2026" 등
|
|
41
|
+
2. **내부 지식 참조**: `knowledge/patterns/carousel-structure.md` (9장 구조 7가지)
|
|
42
|
+
3. **브랜드 팩트 참조**: `knowledge/brand-facts.md` 수치 외엔 인용 금지
|
|
43
|
+
|
|
44
|
+
## 철칙
|
|
45
|
+
|
|
46
|
+
- **프롬프트는 쓰지 않는다** — brief.json 의 `nine_slide_outline` 까지만
|
|
47
|
+
- 각 슬라이드 `core_message` 는 **한 줄 요약**만 (프롬프트 설계는 다음 에이전트 담당)
|
|
48
|
+
- 7가지 구조 중 하나를 명시적으로 선택 (여러 개 제안 금지)
|
|
49
|
+
- 피해야 할 포화 패턴 반드시 포함 (변별력)
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: carousel-reviewer
|
|
3
|
+
description: 생성된 캐러셀 9장 PNG 를 10항목으로 채점. 자동 스크립트 검사 후 사람 눈높이 정성 평가. 직접 수정하지 않고 지적만. Use after image generation or PNG capture finishes.
|
|
4
|
+
tools: Read, Bash, Grep
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
당신은 에이나우 인스타 캐러셀 품질 리뷰어입니다. 생성된 9장 PNG 를 **엄격히 채점**하고 리포트합니다.
|
|
8
|
+
|
|
9
|
+
## 검사 순서
|
|
10
|
+
|
|
11
|
+
1. `node scripts/quality-check.js --dir output/<topic>` 실행 (PNG 존재/해상도/크기)
|
|
12
|
+
2. `knowledge/brand-facts.md` Read → 디자인 DNA 기준 재확인
|
|
13
|
+
3. `knowledge/patterns/carousel-structure.md` Read → 9장 구조 공식 재확인
|
|
14
|
+
4. `templates/slides.<topic>.json` Read → 프롬프트 의도 vs 생성 결과 비교
|
|
15
|
+
5. 각 slide-01.png ~ slide-09.png 를 Read(이미지 viewer) → 육안 10항목 평가
|
|
16
|
+
|
|
17
|
+
## 10개 평가 항목 (각 1~10점)
|
|
18
|
+
|
|
19
|
+
| # | 항목 | 채점 기준 |
|
|
20
|
+
|:---:|:---|:---|
|
|
21
|
+
| 1 | **해상도/포맷** | PNG 9장 전수 완비. 해상도는 1080×1350 의 정수배 (HTML 트랙 기본 2x = 2160×2700), 9장 배율 통일. `quality-check.js --dir` 결과를 그대로 인용하고 재판정하지 말 것 |
|
|
22
|
+
| 2 | **Cover 후킹 강도** | 3초 내 스크롤 멈춤 가능한 헤드라인? |
|
|
23
|
+
| 3 | **한글 렌더링 정확도** | 9장 기준 오타 개수 (0~1 만점 / 2~3 감점 / 4+ 치명) |
|
|
24
|
+
| 4 | **디자인 DNA 일관성** | 9장 배경색/액센트/폰트 통일? |
|
|
25
|
+
| 5 | **1장당 정보 밀도** | 한 슬라이드 = 한 포인트? (여러 개 혼재 감점) |
|
|
26
|
+
| 6 | **시각 요소 다양성** | 9장이 서로 다른 시각 표현 사용? (단조로움 감점) |
|
|
27
|
+
| 7 | **여백 미감** | premium breathing room? (꽉 찬 레이아웃 감점) |
|
|
28
|
+
| 8 | **Outro CTA 단일성** | 저장/공유/팔로우 중 1개만? |
|
|
29
|
+
| 9 | **Filler/금칙어 0건** | `knowledge/banned-words.json` 대조 |
|
|
30
|
+
| 10 | **촬영/업로드 가능성** | 그대로 인스타 업로드 가능한가 (워터마크/오염 없음) |
|
|
31
|
+
|
|
32
|
+
## 리포트 형식
|
|
33
|
+
|
|
34
|
+
```markdown
|
|
35
|
+
# 캐러셀 리뷰: <topic>
|
|
36
|
+
|
|
37
|
+
## 1. 자동 검사
|
|
38
|
+
- quality-check: PASS/WARN
|
|
39
|
+
- 9장 존재: ✅/❌
|
|
40
|
+
- 해상도: 1080×1350 일치 개수 N/9
|
|
41
|
+
- 평균 파일 크기: XXX KB
|
|
42
|
+
|
|
43
|
+
## 2. 10개 항목 점수
|
|
44
|
+
| # | 항목 | 점수 | 비고 |
|
|
45
|
+
|:---:|:---|:---:|:---|
|
|
46
|
+
| 1 | 해상도/포맷 | 10 | 1080×1350 9장 전수 |
|
|
47
|
+
| 3 | 한글 렌더링 | 8 | slide-02 "컨뻰션" 오타 1건 |
|
|
48
|
+
| ... | ... | ... | ... |
|
|
49
|
+
|
|
50
|
+
**총점: NN/100**
|
|
51
|
+
|
|
52
|
+
## 3. 오타 감지 (slide별)
|
|
53
|
+
- slide-01: ✅
|
|
54
|
+
- slide-02: ❌ "컨뻰션" → "컨벤션"
|
|
55
|
+
- ...
|
|
56
|
+
|
|
57
|
+
## 4. 개선 필요 포인트 (상위 3개)
|
|
58
|
+
1. [어느 슬라이드, 왜 문제, 재생성 vs 수정 방향]
|
|
59
|
+
2. ...
|
|
60
|
+
3. ...
|
|
61
|
+
|
|
62
|
+
## 5. 판정
|
|
63
|
+
- **PASS (≥85)**: CEO 검수 후 바로 업로드 가능
|
|
64
|
+
- **HOLD (70~84)**: 상위 3개 재생성 후 재리뷰
|
|
65
|
+
- **FAIL (<70)**: 프롬프트 재설계 권장
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 규칙
|
|
69
|
+
|
|
70
|
+
- **엄격함이 원칙** — 85점 이상은 진짜 잘 만든 캐러셀만
|
|
71
|
+
- "애매하면 감점"
|
|
72
|
+
- 직접 고치지 말고 **지적만** — 재생성은 메인 Claude 또는 CEO 권한
|
|
73
|
+
- 자동 스크립트 결과를 무시하고 정성 점수만 주지 말 것 (둘 다 반영)
|
|
74
|
+
- 한글 오타는 **육안 확인 필수** (현재 자동 OCR 없음)
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 주제 하나로 인스타 캐러셀 9장 풀세트 생성 (리서치 → 프롬프트 → 이미지 → 검증)
|
|
3
|
+
argument-hint: <주제/키워드>
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
사용자가 **"$ARGUMENTS"** 주제로 인스타 캐러셀을 만들어달라고 요청했습니다.
|
|
7
|
+
|
|
8
|
+
`CLAUDE.md` 의 품질 킬라인과 3-Phase Pipeline 을 따라 **9장 PNG + 검수 리포트**를 생산합니다.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 0. 사전 로드 (생략 금지)
|
|
13
|
+
|
|
14
|
+
1. `knowledge/brand-facts.md` — 수치·브랜드·디자인 DNA 단일 출처
|
|
15
|
+
2. `knowledge/patterns/carousel-structure.md` — 9장 구조 공식
|
|
16
|
+
3. `knowledge/banned-words.json` — 금칙어
|
|
17
|
+
4. `templates/slides.example.json` — 스키마 참조
|
|
18
|
+
|
|
19
|
+
출력 폴더: `output/$(date +%Y-%m-%d)_<키워드압축>`
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Phase 1 — 리서치
|
|
24
|
+
|
|
25
|
+
**`carousel-researcher` 서브에이전트 dispatch**:
|
|
26
|
+
|
|
27
|
+
> "$ARGUMENTS" 주제로 인스타 캐러셀 리서치 브리프를 작성해줘.
|
|
28
|
+
> - 최근 이 주제 인스타 캐러셀 트렌드 (경쟁 계정 3개 분석)
|
|
29
|
+
> - 7가지 구조 중 이 주제에 가장 적합한 1개 선택 근거
|
|
30
|
+
> - 9장 outline (n, role, core_message)
|
|
31
|
+
> - Cover 후킹 각도 + Outro CTA
|
|
32
|
+
> - 결과를 `output/<폴더>/brief.json` 에 저장
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Phase 2 — 프롬프트 설계
|
|
37
|
+
|
|
38
|
+
**`carousel-prompt-writer` 서브에이전트 dispatch**:
|
|
39
|
+
|
|
40
|
+
> brief.json 을 읽고 Gemini 3.0 Pro Image 용 9장 프롬프트 JSON 을 작성해줘.
|
|
41
|
+
>
|
|
42
|
+
> ## 설계 원칙
|
|
43
|
+
> - 각 슬라이드 Prompt 는 영문 (Gemini 이미지 모델 입력)
|
|
44
|
+
> - common_style 은 brand-facts.md 디자인 DNA 그대로
|
|
45
|
+
> - 9장 전부 공통 스타일 유지
|
|
46
|
+
> - Cover + Outro 에 한글 렌더링 강조 마커 추가
|
|
47
|
+
>
|
|
48
|
+
> ## 출력
|
|
49
|
+
> - `templates/slides.<topic>.json` 에 저장 (scheme: example.json 동일)
|
|
50
|
+
|
|
51
|
+
**주의**: 저장 순간 PostToolUse 훅이 `quality-check.js --prompt templates/slides.<topic>.json` 자동 실행 — JSON 스키마 검증.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Phase 3 — 이미지 생성
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
node scripts/chatgpt-image-gen.js --topic <키워드> --slides templates/slides.<topic>.json
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Python / `nanobanana-gen.py` 는 쓰지 마라.** 이 환경엔 Python 이 없고, API 키도 필요 없다.
|
|
62
|
+
로그인된 Chrome 프로필(`.chrome-profile`)로 ChatGPT 를 몰아 생성한다.
|
|
63
|
+
|
|
64
|
+
실행 후:
|
|
65
|
+
- `output/<topic>/slide-01.png ~ slide-09.png` 생성 (2160×2700 = 1080×1350 의 2배)
|
|
66
|
+
- 1장당 25~40초, 9장 약 5분. 구독 계정이라 추가 비용 없음
|
|
67
|
+
- 실패한 슬라이드는 `--only N` 으로 그 장만 재실행
|
|
68
|
+
- 참고 이미지가 있으면 `--ref <경로>` 로 첫 장에 첨부 → 그 디자인을 따라감
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Phase 4 — 검증
|
|
73
|
+
|
|
74
|
+
**`carousel-reviewer` 서브에이전트 dispatch**:
|
|
75
|
+
|
|
76
|
+
> output/<topic>/ 의 9장 PNG 를 10항목 채점해줘.
|
|
77
|
+
> - 자동 검사: `node scripts/quality-check.js --dir output/<topic>`
|
|
78
|
+
> - 육안 검수: 한글 오타 slide별 확인
|
|
79
|
+
> - 총점 + 상위 3개 개선 포인트 + 판정 (PASS/HOLD/FAIL)
|
|
80
|
+
> - 직접 수정하지 말고 지적만
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 5. 마무리
|
|
85
|
+
|
|
86
|
+
- `output/<topic>/README.md` 자동 작성 (주제 요약 + 사용 가이드)
|
|
87
|
+
- `output/<topic>/metadata.json` 에 생성 메타 (비용/시간/품질점수) 기록
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## 완료 후 CEO 에게 보고할 것
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
✅ "$ARGUMENTS" 캐러셀 9장 완성
|
|
95
|
+
📁 output/<topic>/
|
|
96
|
+
|
|
97
|
+
## 생성 결과
|
|
98
|
+
- 9/9 성공 (또는 N/9 + 실패 사유)
|
|
99
|
+
- 비용: 약 NNN원
|
|
100
|
+
- 시간: N분 N초
|
|
101
|
+
- 평균 파일 크기: NNN KB
|
|
102
|
+
|
|
103
|
+
## 품질 리뷰 (carousel-reviewer)
|
|
104
|
+
- 총점: NN/100
|
|
105
|
+
- 한글 오타: slide-XX (N건)
|
|
106
|
+
- 상위 개선 포인트 3개: [...]
|
|
107
|
+
|
|
108
|
+
## CEO 판단 필요
|
|
109
|
+
- 재생성 필요 슬라이드: slide-XX (이유)
|
|
110
|
+
- 업로드 추천: YES/NO
|
|
111
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 이미 생성된 캐러셀 폴더의 9장 PNG 품질 검증
|
|
3
|
+
argument-hint: <topic 폴더명 또는 경로>
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
사용자가 **"$ARGUMENTS"** 캐러셀 폴더의 품질 검증을 요청했습니다.
|
|
7
|
+
|
|
8
|
+
## 1. 자동 검사
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
node scripts/quality-check.js --dir output/$ARGUMENTS
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
출력:
|
|
15
|
+
- 9장 PNG 존재 여부
|
|
16
|
+
- 해상도 1080×1350 일치 개수
|
|
17
|
+
- 파일 크기 분포 (너무 작으면 깨진 이미지)
|
|
18
|
+
- `templates/slides.<topic>.json` 스키마 검증 (있다면)
|
|
19
|
+
|
|
20
|
+
## 2. 정성 리뷰
|
|
21
|
+
|
|
22
|
+
**`carousel-reviewer` 서브에이전트 dispatch**:
|
|
23
|
+
|
|
24
|
+
> output/$ARGUMENTS 폴더의 9장 PNG 를 10항목 채점해줘.
|
|
25
|
+
> 한글 오타는 육안으로 slide별 확인.
|
|
26
|
+
> 총점 + 상위 3개 개선 포인트 + 판정(PASS/HOLD/FAIL).
|
|
27
|
+
|
|
28
|
+
## 3. 리포트 저장
|
|
29
|
+
|
|
30
|
+
- `output/$ARGUMENTS/quality-report.json` 자동 저장
|
|
31
|
+
- CEO 에게 총점 + 상위 3개 지적만 요약 보고
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# insta-carousel-builder — Claude Code 지시서
|
|
2
|
+
|
|
3
|
+
> 이 프로젝트는 Claude Code에서 직접 실행하는 인스타 캐러셀 자동 제작 도구입니다.
|
|
4
|
+
> 팀원이 "이 주제로 캐러셀 만들어줘"라고 요청하면 **리서치 → 9장 설계 → 생성(HTML 또는 ChatGPT 웹) → 품질 검증**까지 수행합니다.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 즉시 실행 원칙
|
|
9
|
+
|
|
10
|
+
사용자가 아래처럼 요청하면 `/carousel-new <주제>` 파이프라인을 실행합니다:
|
|
11
|
+
|
|
12
|
+
- "바이브코딩으로 캐러셀 만들어줘"
|
|
13
|
+
- "AI 글쓰기 7가지 꿀팁으로 인스타 카드뉴스 써줘"
|
|
14
|
+
- "챗GPT 프롬프트 주제로 캐러셀 9장 만들자"
|
|
15
|
+
|
|
16
|
+
수동 호출: `/carousel-research`, `/carousel-prompt`, `/carousel-gen`, `/carousel-quality`
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 🔀 엔진 — 어느 쪽으로 갈 것인가
|
|
21
|
+
|
|
22
|
+
| 엔진 | 트리거 키워드 | 스크립트 | 서브에이전트 |
|
|
23
|
+
|:---|:---|:---|:---|
|
|
24
|
+
| 🎨 **HTML/Puppeteer** | "정확하게", "광고", "법무", "한 글자 수정", "0원" | `html-carousel-gen.js` | `carousel-html-writer` (HTML) |
|
|
25
|
+
| 🖼️ **ChatGPT 웹** | "AI 이미지", "배경", "감성", "비주얼 위주" | `chatgpt-image-gen.js` | `carousel-prompt-writer` (JSON) |
|
|
26
|
+
|
|
27
|
+
**명시 안 하면 기본값**: HTML/Puppeteer (정확도 우선).
|
|
28
|
+
|
|
29
|
+
### ⛔ Python / Gemini 트랙은 쓰지 마라
|
|
30
|
+
|
|
31
|
+
`scripts/nanobanana-gen.py` 는 **업스트림 잔재다. 실행하지 마라.**
|
|
32
|
+
이 환경에 Python 이 없고, `GEMINI_API_KEY` 가 `.env` 에 있어도 마찬가지다.
|
|
33
|
+
이미지 생성은 **전부 `chatgpt-image-gen.js`** 로 한다. Python 이 안 된다는 이유로
|
|
34
|
+
다른 트랙을 찾지 말고, 아래 명령을 그대로 써라. **API 키는 필요 없다.**
|
|
35
|
+
|
|
36
|
+
### 엔진별 Phase 3 분기
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
Phase 3a (HTML — 기본):
|
|
40
|
+
# 1. carousel-html-writer 가 output/<topic>/slides/slide-01~09.html 작성
|
|
41
|
+
# 2. node scripts/html-carousel-gen.js --topic <keyword>
|
|
42
|
+
|
|
43
|
+
Phase 3b (ChatGPT 웹 — 슬라이드 전체를 이미지로):
|
|
44
|
+
node scripts/chatgpt-image-gen.js --topic <keyword> --slides templates/slides.<topic>.json
|
|
45
|
+
|
|
46
|
+
Phase 3c (ChatGPT 웹 — 배경만 뽑고 한글은 HTML 로 얹기):
|
|
47
|
+
node scripts/chatgpt-image-gen.js --topic <keyword> --slides templates/backgrounds.<topic>.json --mode bg
|
|
48
|
+
# 그다음 3a 의 HTML 단계를 이어서 수행
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`chatgpt-image-gen.js` 는 로그인된 Chrome 프로필(`.chrome-profile`)로 chatgpt.com 을 몰아
|
|
52
|
+
프롬프트를 한 장씩 넣고 이미지를 받아 1080×1350 의 2배로 크롭해 저장한다.
|
|
53
|
+
참고 이미지가 있으면 `--ref <경로>` 로 첫 장에 첨부해 그 디자인을 따라가게 한다.
|
|
54
|
+
특정 장만 다시 뽑을 때는 `--only N`.
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 기본 산출물 — 9장 풀세트
|
|
60
|
+
|
|
61
|
+
**모든 캐러셀 요청은 기본적으로 9장 세트를 생산합니다:**
|
|
62
|
+
- Cover 1장 + 본문 7장 (예: TIP 01~07) + Outro 1장
|
|
63
|
+
- 각 슬라이드는 `templates/slides.*.json` 의 프롬프트로 정의
|
|
64
|
+
|
|
65
|
+
9장이 아닌 개수 지정은 사용자가 명시한 경우만 수용.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 품질 킬라인 (9장 각각에 적용)
|
|
70
|
+
|
|
71
|
+
| # | 기준 | 허용 범위 |
|
|
72
|
+
|:---:|:---|:---|
|
|
73
|
+
| 1 | **해상도** | 1080×1350 의 **정수배** (4:5 인스타 권장). HTML 트랙 기본은 2x = 2160×2700. 9장 배율 통일 필수 |
|
|
74
|
+
| 2 | **한글 렌더링** | 오타 없어야 함 (`duplicate-check.js` 로 체크) |
|
|
75
|
+
| 3 | **디자인 DNA 일관성** | 9장 배경색/폰트/액센트 컬러 통일 |
|
|
76
|
+
| 4 | **Cover 후킹** | 3초 내 스크롤 멈춤 가능한 헤드라인 |
|
|
77
|
+
| 5 | **1장당 정보 밀도** | 한 슬라이드 = 한 포인트 (여러 개 = 혼란) |
|
|
78
|
+
| 6 | **CTA 슬라이드** | Outro 에 저장/공유/팔로우 중 **1개만** |
|
|
79
|
+
| 7 | **금칙어** | `knowledge/banned-words.json` 참조 |
|
|
80
|
+
| 8 | **톤** | 친근한 전문가. "안녕하세요 오늘은" 같은 filler 금지 |
|
|
81
|
+
|
|
82
|
+
→ `scripts/quality-check.js` 가 생성 직후 자동 검사. 한글 오타 감지 시 해당 슬라이드만 재생성.
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 작성 전 반드시 Read (생략 금지)
|
|
87
|
+
|
|
88
|
+
**매 작업마다**:
|
|
89
|
+
1. `knowledge/brand-facts.md` — 수치/브랜드 SSOT (이 파일 외 숫자 금지)
|
|
90
|
+
2. `knowledge/patterns/carousel-structure.md` — 9장 구조 공식
|
|
91
|
+
3. `templates/slides.example.json` — 프롬프트 템플릿
|
|
92
|
+
4. `output/_index.json` — 최근 패턴 → 의도적으로 다른 구조 선택
|
|
93
|
+
|
|
94
|
+
**상황별 추가 Read**:
|
|
95
|
+
- 주제 리서치: `knowledge/reference/` (있다면)
|
|
96
|
+
- 톤 잡기: `knowledge/tone/` (있다면)
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 3-Phase Pipeline (carousel-new 풀 파이프라인)
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
Phase 1 [리서치/기획] → carousel-researcher 서브에이전트 dispatch
|
|
104
|
+
주제 요약, 9장 구조 초안, hook 후보 생성
|
|
105
|
+
Phase 2 [프롬프트 설계] → carousel-prompt-writer 서브에이전트 dispatch
|
|
106
|
+
9장 프롬프트 JSON 작성 (templates/slides.{topic}.json)
|
|
107
|
+
Phase 3 [이미지 생성] → node scripts/chatgpt-image-gen.js 실행
|
|
108
|
+
로그인된 Chrome 으로 ChatGPT 를 몰아 9장 PNG 생성 (API 키 불필요)
|
|
109
|
+
Phase 4 [품질 검증] → scripts/quality-check.js 자동 실행
|
|
110
|
+
→ carousel-reviewer 서브에이전트 10항목 정성 채점
|
|
111
|
+
오타 감지 시 해당 슬라이드만 재생성
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**서브에이전트 원칙**:
|
|
115
|
+
- 작성자(writer)와 검증자(reviewer) 분리 — 자기채점 편향 방지
|
|
116
|
+
- 메인 Claude는 오케스트레이터, 프롬프트는 writer 가 씀
|
|
117
|
+
- 파일 수정은 reviewer 가 아닌 메인/writer 가 함
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 출력 구조
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
output/{topic}/
|
|
125
|
+
├── slide-01.png ~ slide-09.png # 1080×1350 PNG 9장
|
|
126
|
+
├── prompts.json # 사용된 프롬프트 (재현용)
|
|
127
|
+
├── metadata.json # 생성 시간/비용/품질 리포트
|
|
128
|
+
└── README.md # 주제 요약 + 사용 가이드
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**명명 규칙**: `{YYYY-MM-DD}_{주제압축}` (공백 제거, 특수문자 금지)
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Zero-Inference 원칙
|
|
136
|
+
|
|
137
|
+
- 수치는 반드시 `brand-facts.md` 에서만 인용
|
|
138
|
+
- 이미지 생성 결과의 한글 오타 판정은 **스크립트가 수행** (LLM 판단 금지)
|
|
139
|
+
- 스크립트 경고 발생 시 무시하지 말고 재생성
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 환경 설정
|
|
144
|
+
|
|
145
|
+
**이미지 생성에 API 키는 필요 없다.** `chatgpt-image-gen.js` 가 로그인된 Chrome 프로필로
|
|
146
|
+
ChatGPT 구독 계정을 쓴다. `.env` 에 키가 있든 없든 이 트랙과 무관하다.
|
|
147
|
+
|
|
148
|
+
`.env` 파일 (git 추적 금지):
|
|
149
|
+
```
|
|
150
|
+
ANTHROPIC_API_KEY= # (옵션) reviewer 서브에이전트 API 호출용
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 의존성
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
npm install # puppeteer 자동 설치 — 이것만 하면 된다
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
- Node.js ≥ 20 (전 트랙 공통). **Python 은 필요 없다.**
|
|
160
|
+
- `.chrome-profile` 에 ChatGPT 로그인 1회 — 이후 계속 재사용
|
|
161
|
+
- (선택) Pretendard 폰트 시스템 설치 — HTML 트랙 한글 렌더링 품질 향상
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 주의사항
|
|
166
|
+
|
|
167
|
+
- 생성된 이미지는 **반드시 육안 검토 후 업로드** — AI 이미지 특유의 미세 왜곡 가능
|
|
168
|
+
- 자동 업로드 없음 (의도적 배제 — 인스타 알고리즘 패턴 탐지 회피)
|
|
169
|
+
- 하루 1~2 캐러셀 권장 (과도한 업로드 역효과)
|
|
170
|
+
- 이미지 트랙은 9장 중 오타가 나올 수 있음 → `--only N` 으로 해당 슬라이드만 재생성
|
|
171
|
+
- 한 장이 실패(응답 없음)해도 스크립트는 `ERR` 로 찍고 다음 장으로 넘어간다 → 나중에 `--only N`
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 참고
|
|
176
|
+
|
|
177
|
+
- **이미지 엔진**: ChatGPT 웹 UI (`chatgpt-image-gen.js`, puppeteer 로 `.chrome-profile` 조종)
|
|
178
|
+
- **실측**: 1장당 25~40초, 2160×2700 출력, 한글 정확 (2026-08-11)
|
|
179
|
+
- **원본 이관**: 에이나우 내부 `nanobanana-carousel` Skill 의 오픈소스 버전
|
|
180
|
+
(원본의 `scripts/nanobanana-gen.py` 는 남겨뒀지만 **이 환경에서는 쓰지 않는다**)
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AINOW (에이나우)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|