Communitygithub.com

Windy-X211/pptx

PowerPoint (.pptx) 프레젠테이션 생성, 편집 및 분석. 'PPT 만들어', '발표자료', '슬라이드', 'PPT 편집', 'PPT 읽기', 'PPT 분석'과 같은 요청이나 'pptx', 'presentation', 'slides' 키워드가 언급될 때 이 스킬이 로드됩니다. 처음부터 생성(pptxgenjs), 템플릿 기반 편집(OOXML 압축 풀기/편집/패킹), 콘텐츠 및 레이아웃 QA 전체 워크플로우를 포괄합니다.

pptx란 무엇인가요?

이 스킬은 PowerPoint 프레젠테이션을 프로그래밍 방식으로 생성, 편집, 분석하는 완전한 워크플로우를 제공합니다. 사용자가 'PPT 만들어', '슬라이드', '발표자료'와 같은 요청을 하거나 'pptx', 'presentation', 'slides' 키워드를 언급할 때 자동으로 로드됩니다. 처음부터 새 프레젠테이션을 만들 때는 pptxgenjs 라이브러리를 사용하고, 기존 템플릿을 편집할 때는 OOOXML을 직접 언패킹/편집/패킹하는 방식을 지원합니다. 콘텐츠 QA는 markitdown을 통해 텍스트를 추출하고, 레이아웃 QA는 전용 validate_layout.py 스크립트로 오버플로우나 빈 슬라이드와 같은 문제를 감지합니다. 생성 전에는 필수적으로 콘텐츠 디자인 계획을 수립하고, 외부 에셋(다이어그램, 차트, 이미지)을 미리 생성해야 합니다. 주로 Claude Code, Cursor, Codex와 같은 AI 에이전트 플랫폼에서 실행되며, Python과 Node.js 환경에서 작동합니다. 전체 워크플로우는 단계별로 실행되며, 누락된 의존성은 필요한 순간에만 설치하여 효율성을 높입니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Windy-X211/AgentCluster-Market/tree/HEAD/skills/pptx

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

단계별 실행 및 의존성 처리

  1. 이 스킬의 워크플로우를 순서대로 따르세요. 각 단계에서 라이브러리, 명령줄 도구, 런타임 또는 폰트를 사용하기 전에 해당 단계에 필요한 의존성만 확인하고, 미리 설치되어 있다고 가정하지 마세요.
  2. 사용 가능한 의존성은 재사용하세요. 하나가 누락된 경우, 현재 OS와 사용 가능한 패키지 관리자를 사용하여 해당 의존성만 설치하고 확인한 후 원래 단계를 다시 시도하세요. 전체 의존성 목록을 미리 설치하지 마세요.
  3. 활성 Python 환경(python -m pip install <package>, 또는 해당 python)을 사용하고, 필요시 작업별 가상 환경을 생성하세요. Node.js 라이브러리는 작업 프로젝트(npm install <package>)에 설치하여 스크립트가 해결할 수 있도록 하세요. 시스템 도구와 폰트는 사용 가능한 OS 패키지 관리자(예: macOS에서는 Homebrew, Debian/Ubuntu에서는 apt, Windows에서는 winget)를 사용하세요.
  4. 설치 시 승인이 필요한 경우 호스트의 권한 흐름을 따르세요. 패키지 관리자나 필요한 권한을 사용할 수 없거나 설치/다운로드가 실패하면 누락된 의존성과 영향을 받는 단계를 보고하고, 무한히 재시도하거나 단계가 통과되었다고 주장하지 마세요. 가능한 경우 독립적인 단계를 계속 진행하세요.
  5. 원래 워크플로우와 품질 검사를 유지하세요. 폰트는 렌더링에 필요할 때만 확인하세요. 텍스트, 내장 도구 또는 자체 포함된 HTML만 사용하는 단계는 패키지 설치가 필요하지 않습니다. 외부 도구 액세스 또는 인증은 패키지 관리자가 아닌 호스트를 통해 처리해야 합니다.

경로 및 실행 환경 규칙 (명령 실행 전 필독)

  • Python 명령어: 이 시스템에서는 python을 사용합니다(Windows에서는 일반적으로 python3이 없습니다). 아래 모든 명령은 python으로 통일합니다.
  • 스크립트 경로: 이 스킬의 스크립트는 AppData/skills/pptx/scripts/에 있습니다(프로젝트 루트 기준). 아래 및 editing.md / pptxgenjs.md의 스크립트 명령은 모두 기본 디렉토리를 기준으로 한 절대/상대 경로로 작성되어 있으므로 프로젝트 루트에서 직접 실행할 수 있습니다.
  • 작업 디렉토리: 명령은 현재 작업 디렉토리가 프로젝트 루트라고 가정합니다. 작업 디렉토리가 다른 경우(예: default_workdir가 변경된 경우), AppData/skills/pptx를 스킬 디렉토리의 절대 경로로 바꾸세요.
  • Node.js: npm/node를 실행하기 전(pptxgenjs 필요), 프로젝트 규칙에 따라 Node.js 디렉토리를 PATH에 추가하세요.

PPTX 스킬

빠른 참조

작업가이드
콘텐츠 읽기/분석python -m markitdown presentation.pptx
템플릿 편집 또는 생성editing.md 읽기 — QA: validate_layout.py + markitdown
처음부터 생성1. 콘텐츠 계획 → 2. 에셋 미리 생성 → 3. pptxgenjs.md 읽기
오버플로우 방지 설계pptxgenjs.md 읽기
디자인 시스템 생성python AppData/skills/pptx/scripts/design/search.py "<주제>" --design-system
생성 후 수정python AppData/skills/pptx/scripts/fix_pptx.py output.pptx
레이아웃 QA (필수 우선)python AppData/skills/pptx/scripts/validate_layout.py presentation.pptx

콘텐츠 읽기

# 텍스트 추출
python -m markitdown presentation.pptx

# 원시 XML
python AppData/skills/pptx/scripts/unpack.py presentation.pptx unpacked/

편집 워크플로우

자세한 내용은 editing.md를 읽으세요.

  1. markitdown으로 템플릿 분석
  2. 압축 풀기 + 스타일 레이어 확인 + 테마 및 스타일 정렬 계획
  3. 슬라이드 조작 → 콘텐츠 편집 → 정리 → 패킹
  4. ⚠️ 레이아웃 QA (필수 게이트): python AppData/skills/pptx/scripts/validate_layout.py output.pptx --slides <편집된_슬라이드_번호>
  5. ⚠️ 콘텐츠 QA (필수): python -m markitdown output.pptx

처음부터 생성

자세한 내용은 pptxgenjs.md를 읽으세요.

템플릿이나 참조 프레젠테이션이 없을 때 사용합니다.

필수 슬라이드 구조 (처음부터 생성 시에만 해당)

처음부터 프레젠테이션을 생성할 때는 반드시 다음 구조를 따라야 합니다:

  1. 슬라이드 1: 표지
  2. 슬라이드 2: 목차 (의제)
  3. 슬라이드 3부터: 슬라이드 2에 나열된 순서대로 콘텐츠 섹션
  4. 마지막 슬라이드: 마무리/감사 인사 페이지

목차 슬라이드를 건너뛰지 마세요. 목차 앞에 콘텐츠 슬라이드를 배치하지 마세요.

⚠️ 빈 슬라이드 금지

모든 슬라이드에는 슬라이드 내에 최소 하나의 표시 요소(addText, addShape, addImage, addChart 또는 addTable)가 반드시 포함되어야 합니다. 배경색만 있고 콘텐츠 요소가 없는 슬라이드는 생성 결함입니다.

빈 슬라이드의 일반적인 원인:

  • 섹션 구분/전환 슬라이드에 콘텐츠 추가를 잊은 경우
  • 생성 중간에 토큰이 잘려 일부 슬라이드가 비어 있는 경우
  • 슬라이드 레이아웃이나 마스터가 자동으로 콘텐츠를 채울 것이라고 가정하는 경우 (그렇지 않습니다 — pptxgenjs는 상속된 도형 없이 최소 레이아웃을 생성합니다)

슬라이드를 섹션 구분용으로 의도한 경우, 반드시 명시적으로 요소를 추가하세요 — 예를 들어 큰 섹션 번호, 제목 텍스트 및/또는 장식 도형을 추가하세요.


⚠️ 필수: 생성 전 계획

코드를 작성하기 전에 반드시 다음 계획 단계를 완료하세요:

⚡ 간단한 요청에 대한 빠른 경로: 사용자가 짧고 간단한 덱(≤ 6페이지, 단일 주제, 복잡한 다이어그램 없음)을 요청하는 경우, 공식적인 계획 출력을 건너뛰고 바로 3단계(코드 작성)로 이동하여 표준 표지 + 목차 + (N-3) 콘텐츠 + 마무리 구조를 사용하세요. 빠른 경로 = 응답 본문에 장황한 계획 없이 바로 스크립트를 빌드하고 실행합니다.

1단계: 콘텐츠 디자인 계획 출력

다음을 포함한 구조화된 계획을 제시하세요:

  1. 전체 테마 및 스타일

    • 색상 팔레트 선택 ("디자인 아이디어" 섹션 참조)
    • 타이포그래피 쌍
    • 슬라이드 전체에 걸쳐 사용할 시각적 모티프
  2. 슬라이드별 개요

    슬라이드 1: 표지 - 레이아웃 유형, 주요 요소
    슬라이드 2: 목차 - 정렬된 섹션 목록
    슬라이드 3: [목차의 섹션 1] - 레이아웃 유형, 주요 요소, 인사이트 계획(시각적 자료인 경우)
    ...
    슬라이드 N: 마무리 / 감사합니다 - 레이아웃 유형, 주요 요소
    ...
    
  3. 시각적 요소 목록

    • 필요한 모든 이미지, 아이콘, 차트, 다이어그램을 나열하세요.
    • 각각을 [내장](pptxgenjs 도형/차트) 또는 [외부](사전 생성 필요)로 표시하세요.

계획 출력 예시:

## 프레젠테이션 계획

**테마:** 오션 그라디언트 팔레트 (065A82, 1C7293, 21295C)
**폰트:** Georgia (제목) + Calibri (본문)
**모티프:** 왼쪽 악센트 테두리가 있는 둥근 카드

### 슬라이드:
1. 표지 슬라이드 - 중앙 정렬 제목, 그라디언트 배경
2. 목차 - 개요 / 아키텍처 / 메트릭 / 타임라인
3. [목차의 섹션 1] - 레이아웃 유형, 주요 요소, 인사이트 계획(시각적 자료인 경우)
...
n. 감사합니다 - 마무리 문구 + 연락처

⚠️ 계획을 출력한 후 즉시 2단계와 3단계로 진행하세요. 계획을 다시 수립하지 말고, 약간의 변형으로 동일한 개요를 다시 설명하지 마세요. 계획을 한 번 출력한 다음 pptxgenjs 코드 작성을 시작하세요.

2단계: 외부 에셋 사전 생성

[외부]로 표시된 그림의 경우, pptxgenjs 코드를 작성하기 전에 미리 생성하세요.

⚠️ 중요: 색상 일관성

생성된 모든 다이어그램과 차트는 프레젠테이션과 동일한 색상 팔레트를 사용해야 합니다. 선택한 테마에 따라 생성 스크립트 상단에 색상을 정의하세요.

옵션 A: 네이티브 도형/차트 우선 (필수 기본값)

모든 아키텍처 다이어그램, 순서도, 프로세스 다이어그램, 조직도 및 관계 다이어그램은 pptxgenjs 네이티브 도형(RECTANGLE, OVAL, LINE, 커넥터 + addText)으로 구축해야 합니다. 패턴 및 예제는 pptxgenjs.md의 "네이티브 도형으로 다이어그램 구축"을 참조하세요.

  • 적합한 템플릿 슬라이드(프로세스, 비교, 2열, 아이콘 그리드)가 있을 때 사용하세요.
  • 흐름, 아키텍처 및 계층 구조에는 pptxgenjs 네이티브 도형(박스/화살표/선 + 텍스트)을 사용하세요.
  • 간단한 데이터 차트(막대, 원형, 꺾은선 등)에는 pptxgenjs 차트를 사용하세요.
  • pptxgenjs 차트로 처리할 수 없는 복잡한 통계 차트(히트맵, 산점도, 상자 그림)에만 matplotlib로 대체하세요.
  • 다이어그램이 네이티브 도형으로 너무 복잡하고 많은 교차 링크가 포함된 경우에만 Mermaid로 대체하세요.

옵션 B: Matplotlib/Python 차트

PPT 테마와 일치하도록 시작 부분에 색상 팔레트를 정의하세요:

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

# ============================================================
# 색상 팔레트 - PPT 테마와 일치
# ============================================================
# 예: "오션 그라디언트" 테마
COLORS = {
    'primary': '#065A82',
    'secondary': '#1C7293',
    'accent': '#21295C',
    'background': '#F0F7FA',
    'text': '#21295C',
    'light': '#E8F4F8',
}

# 여러 데이터 시리즈용 색상 순환
COLOR_CYCLE = [COLORS['primary'], COLORS['secondary'], COLORS['accent'], '#4A90A4', '#2D5A6B']

# 테마를 전역적으로 적용
plt.rcParams.update({
    'axes.prop_cycle': plt.cycler(color=COLOR_CYCLE),
    'axes.facecolor': 'none',
    'axes.edgecolor': COLORS['text'],
    'axes.labelcolor': COLORS['text'],
    'text.color': COLORS['text'],
    'xtick.color': COLORS['text'],
    'ytick.color': COLORS['text'],
    'figure.facecolor': 'none',
    'font.family': 'sans-serif',
    'font.size': 12,
})
# ============================================================

# 테마 색상으로 차트 생성
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
bars = ax.bar(['Q1', 'Q2', 'Q3', 'Q4'], [25, 40, 35, 50],
              color=[COLORS['primary'], COLORS['secondary'], COLORS['primary'], COLORS['secondary']],
              edgecolor=COLORS['accent'], linewidth=1.5)
ax.set_title('분기별 수익', fontsize=16, fontweight='bold', color=COLORS['text'])
ax.set_ylabel('수익 ($M)', color=COLORS['text'])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.tight_layout()
width_px, height_px = int(8 * 150), int(5 * 150)
plt.savefig(f'chart_{width_px}x{height_px}.png', dpi=150, transparent=True)
plt.close()

Matplotlib 팔레트 템플릿:

# 미드나잇 임원
COLORS = {'primary': '#1E2761', 'secondary': '#CADCFC', 'accent': '#FFFFFF', 'text': '#1E2761'}

# 숲과 이끼
COLORS = {'primary': '#2C5F2D', 'secondary': '#97BC62', 'accent': '#F5F5F5', 'text': '#2C5F2D'}

# 코랄 에너지
COLORS = {'primary': '#F96167', 'secondary': '#F9E795', 'accent': '#2F3C7E', 'text': '#2F3C7E'}

# 웜 테라코타
COLORS = {'primary': '#B85042', 'secondary': '#E7E8D1', 'accent': '#A7BEAE', 'text': '#B85042'}

# 틸 트러스트
COLORS = {'primary': '#028090', 'secondary': '#00A896', 'accent': '#02C39A', 'text': '#028090'}

다음과 같은 경우에 사용하세요:

  • 복잡한 통계 차트(막대, 꺾은선, 원형, 산점도, 레이더 등)
  • pptxgenjs에서 지원하지 않는 사용자 정의 시각화
  • 히트맵, 산점도, 상자 그림

⚠️ 다음에는 matplotlib를 사용하지 마세요:

  • 아키텍처 다이어그램
  • 순서도 / 프로세스 다이어그램
  • 조직도 / 계층 구조 다이어그램
  • 네트워크 토폴로지 다이어그램
  • 구성 요소 간의 관계를 주로 보여주는 다이어그램

이러한 것은 편집 가능한 PPT 객체로 렌더링되도록 pptxgenjs 네이티브 도형으로 구축해야 합니다(래스터 이미지가 아님).

matplotlib - CJK 지원 차트

중국어 텍스트가 포함된 matplotlib 차트/그래프를 생성할 때는 반드시 폰트를 구성해야 합니다:

import os
import platform
import matplotlib.pyplot as plt
import matplotlib

def setup_matplotlib_cjk():
    """CJK 문자를 지원하도록 matplotlib 구성"""
    system = platform.system()

    if system == "Darwin":  # macOS
        font_names = ['Arial Unicode MS', 'PingFang SC', 'Heiti SC', 'STHeiti']
    elif system == "Windows":
        font_names = ['Microsoft YaHei', 'SimHei', 'SimSun']
    else:  # Linux
        font_names = ['Noto Sans CJK SC', 'WenQuanYi Zen Hei', 'Droid Sans Fallback']

    # 사용 가능한 폰트 찾기
    available_fonts = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
    for font_name in font_names:
        if font_name in available_fonts:
            plt.rcParams['font.sans-serif'] = [font_name] + plt.rcParams['font.sans-serif']
            plt.rcParams['axes.unicode_minus'] = False  # 마이너스 기호 표시 수정
            return font_name
    return None

# 차트를 생성하기 전에 CJK 폰트 설정
cjk_font = setup_matplotlib_cjk()

# 중국어 레이블이 있는 막대 차트 생성
categories = ['1분기', '2분기', '3분기', '4분기']
values = [120, 135, 142, 158]

plt.figure(figsize=(10, 6))
plt.bar(categories, values, color='steelblue')
plt.title('분기별 판매 데이터 Quarterly Sales', fontsize=16)
plt.xlabel('분기 Quarter', fontsize=12)
plt.ylabel('판매액 Sales', fontsize=12)
plt.tight_layout()
plt.savefig('chart.png', dpi=150)
plt.close()

옵션 C: 이미지 웹 검색

다음과 같은 경우 관련 이미지를 검색하세요:
- 스톡 사진이나 일러스트레이션이 필요한 경우
- 아이콘 또는 로고가 필요한 경우
- 개념에 대한 참조 이미지가 필요한 경우

옵션 D: Mermaid 다이어그램 (최후의 수단)

다이어그램을 네이티브 도형/레이아웃으로 깔끔하게 표현할 수 없고 덱과 일관성을 유지해야 하는 경우에만 사용하세요:

# 필요한 경우 설치: npm install -g @mermaid-js/mermaid-cli

PPT 팔레트와 일치하는 테마 구성 파일을 생성하세요:

// mermaid-config.json - "오션 그라디언트" 테마 예시
{
  "theme": "base",
  "themeVariables": {
    "primaryColor": "#065A82",
    "primaryTextColor": "#FFFFFF",
    "primaryBorderColor": "#21295C",
    "secondaryColor": "#1C7293",
    "secondaryTextColor": "#FFFFFF",
    "secondaryBorderColor": "#065A82",
    "tertiaryColor": "#E8F4F8",
    "tertiaryTextColor": "#21295C",
    "lineColor": "#21295C",
    "textColor": "#21295C",
    "mainBkg": "#E8F4F8",
    "nodeBorder": "#065A82",
    "clusterBkg": "#F0F7FA",
    "titleColor": "#21295C",
    "edgeLabelBackground": "#FFFFFF"
  }
}
cat > diagram.mmd << 'EOF'
graph LR
    A[클라이언트] --> B[API 게이트웨이]
    B --> C[서비스 A]
    B --> D[서비스 B]
EOF

# PPT 사용을 위해 고해상도 내보내기 선호
mmdc -i diagram.mmd -o diagram.png -c mermaid-config.json -b white -w 1600 --scale 2

3단계: 이미지 명명 규칙 (필수)

생성된 모든 이미지 파일 이름에는 반드시 크기가 포함되어야 합니다:

{이름}_{너비}x{높이}.png

예시:

  • architecture_800x600.png - 800px 너비, 600px 높이
  • timeline_1200x400.png - 1200px 너비, 400px 높이
  • chart_600x600.png - 600px 정사각형

이미지를 저장할 때 항상 크기를 포함하세요:

# Matplotlib 예시
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
# ... 차트 생성 ...
width_px = int(8 * 150)   # 1200
height_px = int(5 * 150)  # 750
plt.savefig(f'chart_{width_px}x{height_px}.png', dpi=150, transparent=True)
# 일반적인 ffmpeg/ImageMagick 예시
# ...

관련 스킬