A 4-Agent pipeline for producing townhall materials. When the user provides just the deck ID and topic, the four agents run sequentially and slides are inserted into Google Slides.
Team Composition
| Agent | Role | Input → Output |
|---|---|---|
| 🔍 Researcher | Data collection & analysis | Context sources → townhall/DATA.md |
| 📝 Summarizer | PPT structure design | DATA.md → townhall/OUTLINE.md |
| 🎨 Designer | Apps Script code generation | OUTLINE.md → townhall/slides.gs |
| 💻 Developer | Insert slides into the actual deck | slides.gs → Google Slides (Chrome automation) |
Preparation Before Execution
When the skill is triggered:
-
Confirm with the user:
- 덱 ID: Google Slides file ID to insert into (from the URL, the part after
/d/) - Topic: Which section slides to create (e.g., "Financial Status", "Corporate Operations", "Annual Goals")
- Data source: Where to pull data from (context sync files, direct input, etc.)
- 덱 ID: Google Slides file ID to insert into (from the URL, the part after
-
townhall/If the folder does not exist, create it -
Check existing context files:
.claude/skills/my-context-sync/sync/Latest fileagent/projects/finance/filesagent/projects/ar_automation/memory/financial_state.md
Execution Flow
[입력] 덱 ID + 주제 + 데이터 소스
↓
[1단계] 리서처 에이전트 → DATA.md 생성
↓
[DATA 검증] 필수 섹션 확인 → 실패 시 재실행 (1회)
↓
[2단계] 요약가 에이전트 → OUTLINE.md 생성
↓
[OUTLINE 검증] 슬라이드 수 확인 (최소 1장) → 실패 시 재실행 (1회)
↓
[3단계] 디자이너 에이전트 → slides.gs 생성
↓
[코드 검증] 파일 존재 + addSlides 함수 포함 여부 확인
↓
[4단계] 개발자 (오케스트레이터) → Chrome 자동화로 실행
↓
[최종 보고] 슬라이드 추가 완료 + 덱 URL 출력
How to Run Each Agent
🔍 Step 1: Researcher Agent
Task(
description="리서처: 타운홀 데이터 수집",
prompt="""
너는 EO Studio 재무·운영 데이터 리서처다.
아래 주제에 맞는 데이터를 수집·정리해서 townhall/DATA.md를 작성하라.
주제: {topic}
데이터 소스:
- .claude/skills/my-context-sync/sync/ 폴더의 최신 컨텍스트 싱크 파일
- agent/projects/ar_automation/memory/financial_state.md (존재 시)
- agent/projects/finance/ 폴더 (존재 시)
- CLAUDE.md의 현재 진행 상태 섹션
DATA.md 형식:
# 타운홀 데이터: {topic}
수집일: {날짜}
## 핵심 수치
- 항목별 수치를 bullet로 정리 (단위 포함)
## 세부 내역
- 카테고리별 상세 데이터
## 현황 및 이슈
- 진행 중인 항목
- 블로커 또는 주요 이슈
## 파이프라인 / 전망
- 예정된 항목, 목표 수치
수집한 모든 관련 데이터를 townhall/DATA.md에 저장하라.
""",
subagent_type="general-purpose"
)
📝 Step 2: Summarizer Agent
Task(
description="요약가: 슬라이드 구조 설계",
prompt="""
너는 EO Studio 타운홀 슬라이드 기획자다.
townhall/DATA.md를 읽고, 발표용 슬라이드 구조를 설계해서 townhall/OUTLINE.md를 작성하라.
규칙:
- 슬라이드는 2~4장으로 구성 (너무 많으면 전달력 저하)
- 각 슬라이드는 하나의 핵심 메시지만 전달
- 수치는 임팩트 있게 배치 (가장 큰 숫자를 헤드라인으로)
- 한국어와 영어를 적절히 혼용 (레이블은 영어, 내용은 한국어)
OUTLINE.md 형식:
# 타운홀 슬라이드 구조: {topic}
## SLIDE 1: {슬라이드 제목}
- 헤드라인 수치: (가장 강조할 숫자)
- 서브 타이틀: (한 줄 설명)
- 좌측 블록:
- 제목:
- 항목들: (리스트)
- 우측 블록:
- 제목:
- 항목들: (리스트)
- 하단 메시지: (핵심 takeaway 한 줄)
## SLIDE 2: {슬라이드 제목}
(동일 형식)
## 디자인 가이드
- 배경: 블랙 (#0D0D0D)
- 강조색: EO 옐로우 (#E8FF47)
- 폰트 색: 흰색, 회색 (#888888)
- 레이아웃: 좌우 분할 또는 카드형
완성된 OUTLINE을 townhall/OUTLINE.md에 저장하라.
""",
subagent_type="general-purpose"
)
🎨 Step 3: Designer Agent
Task(
description="디자이너: Apps Script 코드 생성",
prompt="""
너는 Google Apps Script 전문 개발자다.
townhall/OUTLINE.md를 읽고, 기존 Google Slides 덱에 슬라이드를 추가하는 Apps Script 코드를 작성하라.
덱 ID: {deck_id}
반드시 지켜야 할 규칙:
1. SlidesApp.openById(DECK_ID)로 기존 덱 열기 (create 절대 금지)
2. presentation.appendSlide()로 슬라이드 추가
3. SlidesApp.getUi()는 사용 금지 (에러 발생)
4. Logger.log()로 완료 메시지와 URL 출력
5. 함수명은 반드시 addSlides()로 통일
색상 팔레트 (반드시 사용):
- BLACK: "#0D0D0D"
- WHITE: "#FFFFFF"
- GRAY_DARK: "#1E1E1E"
- GRAY_MID: "#2E2E2E"
- ACCENT: "#E8FF47" (EO 시그니처 옐로우)
- TEXT_MUTED: "#888888"
- GREEN: "#4CAF50"
유틸 함수 패턴 (반드시 포함):
function addText(slide, text, x, y, w, h, opts) { ... }
function addRect(slide, x, y, w, h, color, opacity) { ... }
function addLine(slide, x, y, length, color) { ... }
슬라이드 사이즈: W=720, H=405 (16:9 기준 pt)
각 슬라이드 상단 공통 헤더:
- 좌: "FINANCE · {날짜}" (9pt, TEXT_MUTED)
- 우: "{날짜}" (9pt, TEXT_MUTED, right-align)
- 구분선: addLine(slide, 40, 46, W-80, GRAY_MID)
OUTLINE.md의 내용을 정확히 코드로 구현하라.
완성된 코드를 townhall/slides.gs 파일로 저장하라.
""",
subagent_type="general-purpose"
)
💻 Step 4: Developer (executed directly by the orchestrator)
Step 4 requires Chrome automation, so the orchestrator (main Claude) executes it directly.
Execution order:
townhall/slides.gsRead the file- Open the Apps Script editor in Chrome (work account)
- Insert the code into the Monaco editor
- Save →
addSlidesSelect function → Run - Check the execution log → capture the completion message
- Go to the deck and screenshot the result
Validation Logic
DATA validation
townhall/DATA.mdRead and check:
핵심 수치Whether the section exists- Whether actual numeric data (numbers) is included
OUTLINE validation
townhall/OUTLINE.mdRead and check:
SLIDEKeyword appears at least once헤드라인or블록Whether the section exists
Code validation
townhall/slides.gsRead and check:
addSlidesWhether the function existsopenByIdWhether it is used (if create is used, regenerate)getUiWhether it is unused
Final Report Format
✅ 타운홀 슬라이드 생성 완료!
📁 생성 파일:
townhall/DATA.md — 수집 데이터
townhall/OUTLINE.md — 슬라이드 구조
townhall/slides.gs — Apps Script 코드
🖼️ 추가된 슬라이드: N장
🔗 덱 URL: https://docs.google.com/presentation/d/{DECK_ID}/edit
Usage Examples
"재무 현황 타운홀 슬라이드 만들어줘"→/townhalltrigger"이번 달 타운홀 에이전시로 만들어줘""법인 운영 현황 슬라이드 에이전시팀으로 추가해줘"
Precautions
- Communication between agents is via filesonly through (DATA.md → OUTLINE.md → slides.gs)
- Step 4 (developer) is executed directly by the orchestrator via Chrome automation
slides.gs에getUi()if present, runtime error → rerun designer agent- Running the same deck multiple times accumulates slides → confirm with the user before running
townhall/folder is created in the working root (C:\Users\ash\ash\)