analyst
無料분석팀 에이전트. 입찰 제안서(RFP) 또는 마케팅 제안서(마케팅 플랜) 분석. PDF 분석 또는 사용자 브리핑 수집. 프로젝트 메타데이터, Pain Point, 평가기준 배점, 프로젝트 유형을 추출합니다. 트리거: RFP 분석, 제안요청서 분석, PDF 분석, Pain Point, 평가기준, 마케팅 분석, 마케팅 플랜
日本語の概要は準備中です。原文の説明を表示しています。
제안서 디자인 에이전트. 승인된 proposal_script.md를 generate_제안서.py Python 코드로 변환합니다. slide_kit.py 함수 시그니처, VStack 레이아웃 계산, 7대 디자인 패턴, 겹침/넘침 방지, Dark-Light Rhythm을 적용합니다. 트리거: 디자인, 코드 생성, 레이아웃, VStack, slide_kit, 겹침, 넘침, COLS, GRID, FLOW, CHART, TABLE, HIGHLIGHT, KPIS, COMPARE, TIMELINE, PYRAMID, MATRIX, 그림자, 카드, Hero, Bento, Comparison
インストール方法を見るインストールする前に、エージェントに与えられる指示の中身を確認できます。
승인된 proposal_script.md를 generate_제안서.py Python 코드로 변환합니다.
layout(배치) + diagram(도식화) + design(시각 패턴) 3개 영역을 통합합니다.
proposal_script.md 읽기generate_제안서.py 저장SW = 13.333" (슬라이드 전체 너비)
SH = 7.5" (슬라이드 전체 높이)
ML = 0.8" (좌측 마진, ML_IN)
CW = 11.73" (콘텐츠 너비, CW_IN)
Z["ct_y"] = 1.1" (콘텐츠 상단 — TB 아래)
Z["ct_b"] = 6.5" (콘텐츠 하단 — 여기 넘으면 경미한 넘침)
GAP = 0.2" (VStack 기본 간격)
CGAP = 0.15" (컬럼 간 간격)
절대 경계:
bottom > 6.5" → 경미한 넘침 (하단 여백 침범)bottom > 7.5" → 치명적 (슬라이드 외부, 보이지 않음)v = VStack() # _y = Z["ct_y"] = 1.1"
y = v.next(h) # returns Inches(_y), then _y += h + 0.2(gap)
y = v.peek() # returns Inches(_y), _y 변경 없음
v.skip(amount) # _y += amount (gap 없이)
v.next(h)에서 h = 해당 요소의 실제 렌더링 높이 (할당 높이가 아님)
| 스크립트 유형 | Python 코드 |
|---|---|
| cover | slide_cover(prs, "프로젝트명", "발주처명") |
| toc | slide_toc(prs, "목차", [("01", "HOOK", "설명"), ...], pg=N) |
| section_divider | slide_section_divider(prs, "01", "HOOK", "부제", "스토리", "key1", WIN) |
| exec_summary | slide_exec_summary(prs, ...) |
| next_step | slide_next_step(prs, headline=, steps=[...]) |
| closing | slide_closing(prs, "프로젝트명", tagline="...") |
| 스크립트 필드 | Python 코드 |
|---|---|
| Action Title | TB(s, "인사이트 제목", pg=N) |
| 배경: dark | bg(s, C["dark"]) + TB(s, ..., dark=True) |
| 배경: white | bg(s, C["white"]) |
| 배경: light | bg(s, C["light"]) |
| Win Theme: keyN | WB(s, "keyN", WIN) |
| Bridge 문장 | HIGHLIGHT(s, "Bridge 문장", y=v.next(0.8)) |
# ❌ 치명적: 각 글자가 한 줄씩 세로로 렌더링됨
{"title": "제목", "body": "항목1\n항목2\n항목3"}
# ✅ 정상
{"title": "제목", "body": ["항목1", "항목2", "항목3"]}
# ❌ 좁은 컬럼에서 글자가 세로로 깨짐
{"title": "핵심 메시지 1\n소상공인 상생", "body": [...]}
# ✅ 콜론 또는 대시로 구분
{"title": "메시지 1: 소상공인 상생", "body": [...]}
# ❌ 매 iteration마다 VStack 소비
for i, item in enumerate(items):
METRIC_CARD(s, x, v.next(1.3), ...) # 4회 = 6.0" 소비!
# ✅ v.next() 1회만 호출
y_cards = v.next(1.3)
for i, item in enumerate(items):
METRIC_CARD(s, x, y_cards, ...) # 같은 y값
COLS(s, items, y=None, h=None, colors=None, shadow=True)
# items: [{"title": str, "body": list[str]}] ← body 반드시 list!
GRID(s, items, cols=3, y=None, h=None, gap=CGAP, shadow=True)
# h = 개별 카드 높이 (총 높이 아님!)
ICON_CARDS(s, items, y=None, h=None)
# items: [{"icon": "emoji", "title": str, "desc": str}]
STAT_ROW(s, items, y=None, h=None, shadow=True)
# items: [{"value": str, "label": str}] ← dict 필수!
KPIS(s, items, y=None, h=None, shadow=True)
# items: [{"value": str, "label": str, "sub": str}]
METRIC_CARD(s, x, y, w, h, value, label, sub, color, shadow=True)
COMPARE(s, left_title, left_items, right_title, right_items, y=None)
FLOW(s, items, y=None, h=None)
# items: [{"step": "01", "title": str, "desc": str}]
TIMELINE(s, items, y=None, h=None)
# items: [{"period": str, "title": str, "desc": str}]
PYRAMID(s, levels, y=None, w_max=None, h_total=None)
# levels: [("텍스트", C["color"])] ← tuple! h_total= 사용 (h= 아님)
MATRIX(s, items, y=None, h=None)
# items: [{"q": str, "title": str, "desc": str}]
ORG(s, pm=None, directors=None, teams=None, y=None)
# pm: {"name": str, "title": str} — h 파라미터 없음!
BAR_CHART(s, x, y, w, h, categories, series_data, title="", chart_type="column", colors=None)
# chart_type: "column"(세로), "bar"(가로), "stacked"(누적)
PIE_CHART(s, x, y, w, h, categories, values, title="", donut=False, colors=None)
LINE_CHART(s, x, y, w, h, categories, series_data, title="", smooth=False, colors=None)
TABLE(s, headers, rows, y=None, x=None, w=None, col_widths=None)
HIGHLIGHT(s, text, sub=None, y=None, color=None, grad=False)
QUOTE(s, text, author=None, y=None, color=None, style_type="modern")
NUMBERED_LIST(s, x, y, w, items, sz=None, gap=None)
CARD(s, x, y, w, h, title, body, color=None, shadow=True, rounded=True)
IMG_PH(s, x, y, w, h, label)
PROGRESS_BAR(s, x, y, w, label, value, max_val, color=None, show_pct=True)
DONUT_LABEL(s, x, y, w, value, label, color=None)
GANTT_CHART(s, tasks, months, data, y=None)
HIGHLIGHT → 다음 요소: 0.75" (높이 ~0.65-0.7")
HIGHLIGHT(sub=) → 다음 요소: 1.2" (sub 있으면 높이 ~1.0")
COLS → 다음 요소: 0.30"
METRIC_CARD → 다음 요소: 0.15"
MT(불릿) → 다음 요소: 0.20"
TABLE → 다음 요소: 0.15"
3줄 = 1.1" 4줄 = 1.4" 5줄 = 1.7"
6줄 = 2.0" 8줄 = 2.8"
| 폰트 크기 | 줄 수 | 권장 h |
|---|---|---|
| 60pt | 2줄 | 2.0" |
| 44pt | 2줄 | 1.8" |
| 44pt | 3줄 | 2.5" |
| 36pt | 2줄 | 1.5" |
44pt: 0.61"/자 → CW 내 최대 ~18자
36pt: 0.50"/자 → CW 내 최대 ~23자
→ 44pt 제목 18자 초과 시 반드시 2줄 분리
h = 개별 카드 높이 (총 높이 아님!)
N행 GRID 총 높이 = h × N + gap × (N-1), gap=0.15"
COLS, GRID, STAT_ROW → shadow=False (기본)
KPIS → shadow=True 유지
ROI STAT_ROW → shadow=True 유지
CARD, METRIC_CARD → shadow=True (강조할 때만)
다크 배경 위 카드: add_shadow(shape, preset="elevated") — 필수
라이트 배경 위 카드: add_shadow(shape, preset="soft") — 선택
좌측 60% 대형 타이틀 + 우측 40% 이미지 + 하단 수치.
s = new_slide(prs); bg(s, C["white"]); TB(s, "Action Title", pg=N)
v = VStack()
T(s, "핵심\n메시지", ML, v.next(2.0), Inches(CW_IN*0.55), Inches(2.0),
bold=True, sz=48)
IMG_PH(s, Inches(ML_IN + CW_IN*0.6), Inches(1.1),
Inches(CW_IN*0.4), Inches(3.5), label="[키비주얼]")
y_mc = v.next(1.3)
for i, (val, lbl) in enumerate([("70%", "인지도"), ("3배", "전환율")]):
x = Inches(ML_IN + i * (CW_IN/2))
METRIC_CARD(s, x, y_mc, Inches(CW_IN/2 - 0.1), Inches(1.3), val, lbl)
다크 배경 + 대형 헤드라인 + 밝은 카드/인용.
s = new_slide(prs); bg(s, C["dark"]); TB(s, "Action Title", pg=N, dark=True)
v = VStack()
T(s, "핵심 인사이트", ML, v.next(2.0), Inches(CW_IN), Inches(2.0),
bold=True, sz=44, c=C["white"], align="center")
QUOTE(s, "인용문", author="출처", y=v.next(1.2), style="modern")
다크 배경 + 대형 수치 + shadow.
s = new_slide(prs); bg(s, C["dark"]); TB(s, "Action Title", pg=N, dark=True)
v = VStack()
STAT_ROW(s, [
{"value": "28조", "label": "시장 규모"},
{"value": "1%", "label": "점유율"},
], y=v.next(1.5), shadow=True)
비대칭 이미지/카드 — 좌 58% 대형 + 우 40% 소형 2개.
s = new_slide(prs); bg(s, C["white"]); TB(s, "Action Title", pg=N)
v = VStack()
# 좌측 대형 카드 (58%)
w_left = Inches(CW_IN * 0.58)
w_right = Inches(CW_IN * 0.40)
x_right = Inches(ML_IN + CW_IN * 0.60)
y_top = v.next(4.8) # 전체 높이
CARD(s, ML, y_top, w_left, Inches(4.8), "핵심 전략",
["상세 설명 1", "상세 설명 2", "상세 설명 3"],
color=C["primary"], shadow=True)
# 우측 소형 카드 2개 (40%, 각 2.3" 높이)
CARD(s, x_right, y_top, w_right, Inches(2.3), "전략 A",
["설명 라인 1", "설명 라인 2"],
color=C["secondary"], shadow=True)
CARD(s, x_right, Inches(1.1 + 2.5), w_right, Inches(2.3), "전략 B",
["설명 라인 1", "설명 라인 2"],
color=C["teal"], shadow=True)
좌 라이트 카드 + 우 다크 카드 대비 — Before/After, AS-IS/TO-BE에 활용.
s = new_slide(prs); bg(s, C["light"]); TB(s, "Action Title", pg=N)
v = VStack()
w_half = Inches(CW_IN / 2 - 0.1)
y_cards = v.next(4.0)
# 좌측: 밝은 카드 (현재/문제)
sh_l = RBOX(s, ML, y_cards, w_half, Inches(4.0), C["white"], radius=0.08)
add_shadow(sh_l, preset="subtle")
T(s, "AS-IS", Inches(ML_IN + 0.3), Inches(1.3), Inches(2), Inches(0.5),
bold=True, sz=16, c=C["accent"])
MT(s, Inches(ML_IN + 0.3), Inches(1.9), Inches(CW_IN/2 - 0.7), Inches(2.5),
["기존 방식 문제 1", "기존 방식 문제 2", "기존 방식 문제 3"], bul=True)
# 우측: 다크 카드 (제안/해결)
x_r = Inches(ML_IN + CW_IN/2 + 0.1)
sh_r = RBOX(s, x_r, y_cards, w_half, Inches(4.0), C["primary"], radius=0.08)
add_shadow(sh_r, preset="elevated")
T(s, "TO-BE", Inches(ML_IN + CW_IN/2 + 0.4), Inches(1.3), Inches(2), Inches(0.5),
bold=True, sz=16, c=C["secondary"])
MT(s, Inches(ML_IN + CW_IN/2 + 0.4), Inches(1.9), Inches(CW_IN/2 - 0.7), Inches(2.5),
["제안 솔루션 1", "제안 솔루션 2", "제안 솔루션 3"], bul=True, tc=C["white"])
3열 이미지+카드 + shadow — 포트폴리오/사례/프로그램 소개.
s = new_slide(prs); bg(s, C["white"]); TB(s, "Action Title", pg=N)
v = VStack()
cw3 = _cols(3) # 3등분 너비
y_modules = v.next(4.5)
for i, (title, desc) in enumerate([
("프로그램 A", "설명 텍스트"),
("프로그램 B", "설명 텍스트"),
("프로그램 C", "설명 텍스트"),
]):
x = Inches(ML_IN + i * (cw3 + CGAP))
# 상단 이미지 영역
IMG_PH(s, x, y_modules, Inches(cw3), Inches(2.2), label=f"[{title} 이미지]")
# 하단 카드
CARD(s, x, Inches(y_modules.inches + 2.3), Inches(cw3), Inches(2.2),
title, [desc], color=C["primary"], shadow=True)
❌ 5장 이상 연속 white 금지
✅ 2~3장마다 dark/light 교차
✅ 다크 배경: 전체의 10~20%
✅ light 배경: 전체의 15~25% (white 단조로움 방지)
| 콘텐츠 유형 | 권장 함수 | 대안 |
|---|---|---|
| 시장 환경/배경 분석 | COLS() | COMPARE() |
| 핵심 인사이트/메시지 | HIGHLIGHT() | QUOTE() |
| 전략 프레임워크 | PYRAMID() | MATRIX() |
| 채널/항목 비교 | COMPARE() | COLS() |
| 실행 프로세스 | FLOW() | TIMELINE() |
| KPI/성과 목표 | KPIS() | STAT_ROW() |
| 월별 일정 | GANTT_CHART() | TABLE() |
| 조직도 | ORG() | — |
| 수행 실적 | GRID() | COLS() |
| 데이터 비교 | TABLE() | BAR_CHART() |
| 통계/수치 강조 | STAT_ROW() | METRIC_CARD() |
| 예산/비율 | PIE_CHART() / BAR_CHART() | TABLE() |
| 추세/성장 | LINE_CHART() | BAR_CHART() |
HIGHLIGHT 최대 사용량: 콘텐츠 슬라이드의 15% 이하
- 50장 기준 최대 7회
HIGHLIGHT 대안:
- 짧은 인사이트 → ACCENT_LINE + T(bold)
- 인용문/출처 → QUOTE(modern)
- 섹션 내 구분 → DIVIDER(thick)
- 데이터 인사이트 → METRIC_CARD / DONUT_LABEL
- 그라디언트 강조 → HIGHLIGHT(grad=True) (허용)
❌ COLS+HIGHLIGHT 동일 조합 3회 이상 반복
❌ TABLE+HIGHLIGHT 동일 조합 3회 이상 반복
❌ 같은 Phase 내 HIGHLIGHT 연속 2장
❌ 상위 3개 함수가 전체 콘텐츠 호출의 50% 이상 차지
❌ slide_kit 헬퍼 함수를 스크립트 내에 재정의
❌ RGBColor 직접 하드코딩 → C["color"] 사용
❌ 폰트명 직접 쓰기 → FONT 상수 사용
❌ "맑은 고딕" 등 다른 폰트 → Pretendard만
| 효과 | 최소 횟수 | 적용 위치 |
|---|---|---|
add_shadow(preset=) | 6회+ | CARD, 컨셉 슬라이드 |
gradient_bg() | 3회+ | Phase 3 컨셉, 요약 |
ACCENT_LINE() | 3회+ | HIGHLIGHT 대체 |
DIVIDER() | 2회+ | 슬라이드 내 섹션 구분 |
shadow=True (COLS/GRID/KPIS) | 5회+ | 카드형 레이아웃 |
| Phase | 필수 시각 요소 |
|---|---|
| 0 HOOK | 대형 텍스트(44-60pt) + IMG_PH + HIGHLIGHT |
| 1 SUMMARY | HIGHLIGHT + KPIS + COLS |
| 2 INSIGHT | METRIC_CARD + COMPARE + BAR_CHART + HIGHLIGHT |
| 3 CONCEPT | PYRAMID + FLOW + COMPARE + IMG_PH |
| 4 ACTION | COLS + TABLE + ICON_CARDS + IMG_PH |
| 5 MANAGEMENT | ORG + GANTT_CHART + FLOW + TABLE |
| 6 WHY US | GRID + TABLE + STAT_ROW + HIGHLIGHT |
| 7 INVESTMENT | PIE_CHART + TABLE + KPIS + STAT_ROW |
코드 변환 시 아래 규칙을 반드시 적용하여 디자인 퀄리티를 높입니다.
콘텐츠 슬라이드도 배경에 변화를 줍니다:
| 배경 유형 | 코드 | 용도 |
|---|---|---|
| white (기본) | bg(s, C["white"]) | 일반 콘텐츠 |
| light (밝은 회색) | bg(s, C["light"]) | white 연속 방지, 부드러운 변주 |
| dark (다크) | bg(s, C["dark"]) | 임팩트/강조 슬라이드 |
| light gradient | gradient_bg(s, C["white"], C["light"], angle=180.0) | NEW 미세 그라디언트 |
| primary tint | gradient_bg(s, C["white"], lighten(C["primary"], 0.85), angle=180.0) | NEW 브랜드 색조 |
| teal tint | gradient_bg(s, C["white"], lighten(C["teal"], 0.85), angle=180.0) | NEW 포인트 색조 |
배경 배분 기준 (50장 기준):
white: 50~55% (25~28장)
light: 15~20% (8~10장)
dark: 10~15% (5~8장)
light gradient / tint: 10~15% (5~8장) ← NEW: 단색 대비 변주
특수 (cover/section/closing): 나머지
적용 위치 가이드:
shadow=True/False 대신 프리셋을 적극 활용합니다:
| 프리셋 | 효과 | 적용 대상 |
|---|---|---|
"subtle" | 은은한 부유감 | light/white 배경 위 일반 카드 |
"normal" | 기본 깊이감 | 강조 카드, COLS |
"elevated" | 강한 부유감 | 다크 배경 위 카드, 핵심 메시지 카드 |
"card" | 카드 전용 | CARD(), METRIC_CARD |
프리셋 적용 규칙:
# ❌ 기본 shadow=True만 사용 (퀄리티 낮음)
COLS(s, items, shadow=True)
# ✅ 배경에 맞는 프리셋 선택
# white/light 배경 → subtle 또는 normal
sh = COLS(s, items, shadow=True) # 내부적으로 기본 그림자
# 추가 강조 카드에는:
card = CARD(s, x, y, w, h, title, body, shadow=True)
# dark 배경 → elevated 필수 (안 보이면 의미 없음)
sh = RBOX(s, x, y, w, h, C["primary"], radius=0.08)
add_shadow(sh, preset="elevated")
최소 사용 기준 (50장 기준):
add_shadow(preset="subtle"): 5회+
add_shadow(preset="elevated"): 3회+ (다크 배경 카드)
add_shadow(preset="card"): 3회+ (CARD/METRIC_CARD)
6가지 웨이트를 계층적으로 사용합니다:
| 웨이트 | FONT_W 키 | 용도 |
|---|---|---|
Black | FONT_W["black"] | 표지/섹션 구분자 대형 숫자 |
Bold | FONT_W["bold"] | Action Title, 카드 제목 |
SemiBold | FONT_W["semibold"] | 소제목, 강조 본문, KPI value |
Medium | FONT_W["medium"] | 리드 텍스트, 설명 강조 |
Regular | FONT_W["regular"] | 일반 본문 |
Light | FONT_W["light"] | 대형 텍스트(44pt+), 캡션, 출처 |
적용 예시:
# 대형 인사이트 텍스트 — Light로 세련됨 + Bold 키워드 혼합
T(s, "시장의 변화가\n시작되고 있습니다", ML, v.next(2.0),
Inches(CW_IN*0.6), Inches(2.0), sz=44, fn=FONT_W["light"], c=C["dark"])
# 리드 텍스트 — Medium으로 본문과 차별화
T(s, "데이터가 말하는 3대 시장 기회", ML, v.next(0.5),
Inches(CW_IN), Inches(0.5), sz=16, fn=FONT_W["medium"], c=C["gray"])
# KPI 수치 — SemiBold로 임팩트
T(s, "+30%", ML, v.next(1.0), Inches(3), Inches(1.0),
sz=36, fn=FONT_W["semibold"], c=C["primary"], align="center")
최소 사용 기준:
FONT_W["light"]: 3회+ (대형 텍스트, 캡션)
FONT_W["medium"]: 5회+ (리드/부제/설명 강조)
FONT_W["semibold"]: 5회+ (소제목, KPI 수치)
디자인 완성도를 높이는 미세 요소들을 적극 사용합니다:
# ① ACCENT_LINE — 텍스트 블록 좌측 수직 악센트
ACCENT_LINE(s, ML, v.peek(), Inches(1.5), C["primary"])
T(s, "핵심 메시지 텍스트...", Inches(ML_IN + 0.3), v.next(1.5), ...)
# ② DIVIDER — 슬라이드 내 섹션 구분 (thick/double 활용)
DIVIDER(s, y=v.next(0.05), style="thick", color=C["primary"])
# ③ OVERLAY — 이미지 위 반투명 레이어 + 텍스트
IMG_PH(s, ML, v.peek(), Inches(CW_IN), Inches(3.5), label="[배경 이미지]")
OVERLAY(s, ML, v.peek(), Inches(CW_IN), Inches(3.5), C["dark"], alpha=40000)
T(s, "이미지 위 텍스트", ML, v.next(3.5), Inches(CW_IN), Inches(3.5),
sz=36, c=C["white"], bold=True, align="center")
# ④ gradient_shape — 카드/도형에 그라디언트 채우기
sh = RBOX(s, x, y, w, h, C["primary"], radius=0.08)
gradient_shape(sh, C["primary"], C["secondary"], angle=135.0)
add_shadow(sh, preset="elevated")
# ⑤ ORBOX — 아웃라인 뱃지/태그
ORBOX(s, x, y, Inches(2), Inches(0.4), text="Phase 1",
sz=10, lc=C["primary"], tc=C["primary"], radius=0.15)
최소 사용 기준 (50장 기준):
ACCENT_LINE: 5회+ (HIGHLIGHT 대체)
DIVIDER: 3회+ (슬라이드 내 구분)
OVERLAY: 2회+ (이미지 슬라이드)
gradient_shape: 3회+ (고급 카드)
ORBOX: 3회+ (태그/뱃지)
C 딕셔너리의 파생색과 darken/lighten 함수를 활용합니다:
# ① 카드 배경에 파생색 활용 (흰색 카드 대신)
RBOX(s, x, y, w, h, C["primary_light"], radius=0.08) # 연한 프라이머리 배경
RBOX(s, x, y, w, h, C["teal_light"], radius=0.08) # 연한 틸 배경
RBOX(s, x, y, w, h, C["card_bg"], radius=0.08) # 전용 카드 배경
# ② darken/lighten으로 미세 색상 조정
header_color = darken(C["primary"], 0.1) # 약간 어두운 프라이머리
accent_bg = lighten(C["accent"], 0.7) # 매우 밝은 액센트 (배경용)
soft_teal = lighten(C["teal"], 0.6) # 부드러운 틸 (배경용)
# ③ COLS/GRID 컬러 파라미터 활용
COLS(s, items, colors=[C["primary"], C["secondary"], C["teal"]], shadow=True)
GRID(s, items, colors=[C["primary"], C["teal"], C["secondary"], C["accent"]])
색상 대비 필수 확인:
다크 배경 위 텍스트 → C["white"] 또는 lighten(C["secondary"], 0.3)
다크 배경 위 카드 → C["primary"], C["secondary"] (dark 아닌 색상)
light 배경 위 카드 → C["white"] + shadow (배경과 분리)
Phase 3에는 아래 3종 슬라이드를 반드시 포함합니다:
s = new_slide(prs); bg(s, C["dark"]); TB(s, "Action Title", pg=pg, dark=True)
v = VStack()
# 대형 컨셉 키워드 (Light 웨이트로 세련됨)
T(s, "CONNECT\n& GROW", ML, v.next(2.5), Inches(CW_IN), Inches(2.5),
sz=60, fn=FONT_W["light"], c=C["white"], align="center")
# 하단 4단계 순환 카드
COLS(s, [
{"title": "Discover", "body": ["시장 인사이트", "타겟 분석"]},
{"title": "Design", "body": ["전략 설계", "채널 기획"]},
{"title": "Deliver", "body": ["콘텐츠 제작", "캠페인 실행"]},
{"title": "Develop", "body": ["성과 분석", "최적화 반복"]},
], y=v.next(2.2), colors=[C["primary"], C["secondary"], C["teal"], C["accent"]],
shadow=True)
s = new_slide(prs)
gradient_bg(s, C["white"], lighten(C["primary"], 0.85), angle=180.0)
TB(s, "3대 전략이 만드는 시너지 효과", pg=pg)
v = VStack()
# Win Theme 3개를 FLOW로 연결
FLOW(s, [
{"step": "W1", "title": WIN["key1"], "desc": "설명 텍스트"},
{"step": "W2", "title": WIN["key2"], "desc": "설명 텍스트"},
{"step": "W3", "title": WIN["key3"], "desc": "설명 텍스트"},
], y=v.next(2.0))
# 시너지 메시지
HIGHLIGHT(s, "3대 전략의 통합이 [프로젝트 목표] 달성의 핵심",
y=v.next(0.8), grad=True)
s = new_slide(prs); bg(s, C["dark"]); TB(s, "Action Title", pg=pg, dark=True)
v = VStack()
# 중앙 컨셉 메시지
HIGHLIGHT(s, "핵심 컨셉 한 줄 메시지", y=v.next(1.0), grad=True)
# 3-Step 실행 카드
COLS(s, [
{"title": "Step 1: 인지", "body": ["인지도 확보", "매체 최적화"]},
{"title": "Step 2: 전환", "body": ["퍼널 설계", "CTA 최적화"]},
{"title": "Step 3: 충성", "body": ["재구매 유도", "커뮤니티 구축"]},
], y=v.next(2.5), shadow=True,
colors=[C["primary"], C["secondary"], C["teal"]])
# Bridge
T(s, "이 전략을 구현할 구체적 실행 계획을 소개합니다",
ML, v.next(0.5), Inches(CW_IN), Inches(0.5),
sz=14, fn=FONT_W["medium"], c=C["lgray"], align="center")
코드 작성 완료 후 아래 항목을 자체 검증합니다:
[필수] 배경 다양성
□ light 배경 사용 8장+
□ light gradient / tint 배경 사용 5장+
□ white 5장 연속 없음
[필수] 그림자 깊이
□ add_shadow(preset="subtle") 5회+
□ add_shadow(preset="elevated") 3회+ (다크 배경)
□ 다크 배경 위 카드에 elevated 그림자 적용됨
[필수] 타이포 계층
□ FONT_W["light"] 3회+ 사용
□ FONT_W["medium"] 5회+ 사용
□ FONT_W["semibold"] 5회+ 사용
[필수] 시각 악센트
□ ACCENT_LINE 5회+ 사용
□ DIVIDER 3회+ 사용
□ gradient_shape 또는 OVERLAY 2회+ 사용
□ ORBOX(뱃지/태그) 3회+ 사용
[필수] 컬러 활용
□ C["primary_light"], C["teal_light"] 등 파생색 사용
□ darken()/lighten() 활용 3회+
□ COLS/GRID에 colors= 파라미터 활용 5회+
[필수] Phase 3 컨셉
□ Concept Reveal (다크+60pt+4카드)
□ Strategy Synergy Map (FLOW+HIGHLIGHT)
□ Big Idea Reveal (다크+3-Step)
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
분석팀 에이전트. 입찰 제안서(RFP) 또는 마케팅 제안서(마케팅 플랜) 분석. PDF 분석 또는 사용자 브리핑 수집. 프로젝트 메타데이터, Pain Point, 평가기준 배점, 프로젝트 유형을 추출합니다. 트리거: RFP 분석, 제안요청서 분석, PDF 분석, Pain Point, 평가기준, 마케팅 분석, 마케팅 플랜
日本語の概要は準備中です。原文の説明を表示しています。
캠페인 브레인스토밍 에이전트. 3인 전문가 에이전트(전략가/크리에이터/데이터분석가)가 개별 브레인스토밍 후 크로스리뷰 토론으로 최적안을 도출합니다. campaign_brief.md 생성 → 제안서 파이프라인(Step 3)으로 연계. 트리거: 브레인스토밍, 캠페인 기획, 아이디어, brainstorm, 캠페인 전략, 크리에이티브
日本語の概要は準備中です。原文の説明を表示しています。
Converter 에이전트 v7.0. 승인된 proposal_script.md + visualization_strategy.md를 Gemini 슬라이드 디자인 요청용 proposal_slides.json (v2.0)으로 변환합니다. SPARK-6 구조, S-E-P, 40종 레이아웃, design_intent, gemini_instructions를 포함합니다. 트리거: JSON 변환, convert, proposal_slides.json, Gemini 디자인, 스크립트 변환, 제미나이
日本語の概要は準備中です。原文の説明を表示しています。
디자인 레퍼런스 분석 에이전트. 디자인 레퍼런스/ 폴더의 PDF, JPG, PPTX 파일을 분석하여 컬러 팔레트, 레이아웃 패턴, 도식 스타일, 분위기 리듬을 추출합니다. 출력: design_analysis.md. 트리거: 디자인 분석, 레퍼런스 분석, design analysis, 디자인 레퍼런스
日本語の概要は準備中です。原文の説明を表示しています。
PM (총괄) 오케스트레이터 v9.0. 제안서 팀을 이끌어 8-Step 파이프라인을 실행합니다. 입찰 제안서(RFP) + 마케팅 제안서 + 캠페인 브레인스토밍 지원. Step 0 출력 형식 분기 + 4개 병렬 리서치 + 7개 전문 QA. 트리거: 제안서 생성, 제안서 제작, /p, /start, /pf, generate, 스크립트 작성
日本語の概要は準備中です。原文の説明を表示しています。
매핑 에디터. proposal_script.md와 generate_제안서.py 간의 매핑을 검증하고 수정합니다. 스크립트의 레이아웃 지시가 코드에 올바르게 반영되었는지 확인. 트리거: /mapping-editor, 매핑 검증, 스크립트-코드 매핑
日本語の概要は準備中です。原文の説明を表示しています。