Communitygithub.com

Windy-X211/pptx

Crear, editar y analizar presentaciones PowerPoint (.pptx). Carga esta skill cuando el usuario diga 'hacer PPT', 'crear presentación', 'generar diapositivas', 'maquetar PPT', 'modificar PPT', 'leer PPT', 'analizar PPT' o mencione 'pptx', 'presentation', 'slides', 'diapositivas'. Cubre todo el flujo: creación desde cero (pptxgenjs), edición basada en plantillas (desempaquetado/edición/empaquetado OOXML) y verificación de contenido y diseño.

¿Qué es pptx?

Esta skill permite a un agente de IA crear, editar y analizar presentaciones PowerPoint (.pptx) de forma programática. Es útil cuando un usuario solicita generar una presentación desde cero, modificar una existente basada en una plantilla o extraer y analizar el contenido de un archivo .pptx. La skill está diseñada para plataformas como Claude Code, Cursor o Codex, y utiliza herramientas como pptxgenjs para la creación desde cero y manipulación de bajo nivel de OOXML para la edición de plantillas. El flujo de trabajo incluye pasos obligatorios de verificación de diseño y contenido, como validar la maquetación con scripts Python y extraer texto con markitdown. También proporciona directrices para la generación de elementos visuales (imágenes, diagramas, gráficos) manteniendo la coherencia cromática y las convenciones de nomenclatura de archivos.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Windy-X211/AgentCluster-Market/tree/HEAD/skills/pptx

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Ejecución paso a paso y dependencias

  1. Sigue el flujo de trabajo de esta skill en orden. Antes de que un paso utilice una biblioteca, herramienta de línea de comandos, entorno de ejecución o fuente tipográfica, verifica solo las dependencias requeridas por ese paso; no asumas que están instaladas.
  2. Reutiliza las dependencias que estén disponibles. Si falta alguna, instala solo esa dependencia usando el sistema operativo actual y un gestor de paquetes disponible, luego verifícala y vuelve a intentar el paso original. No instales toda la lista de dependencias por adelantado.
  3. Usa el entorno Python activo (python -m pip install <paquete>, o el python correspondiente); crea un entorno virtual local a la tarea si es necesario. Instala las bibliotecas Node.js en el proyecto de la tarea (npm install <paquete>) para que el script pueda resolverlas. Para herramientas del sistema y fuentes, usa el gestor de paquetes del sistema operativo disponible (por ejemplo, Homebrew en macOS, apt en Debian/Ubuntu o winget en Windows).
  4. Sigue el flujo de permisos del anfitrión cuando la instalación requiera aprobación. Si el gestor de paquetes o el permiso requerido no está disponible, o la instalación/descarga falla, informa de la dependencia faltante y el paso afectado; no vuelvas a intentar indefinidamente ni afirmes que el paso se completó. Continúa con los pasos independientes cuando sea posible.
  5. Mantén el flujo de trabajo original y las comprobaciones de calidad. Verifica las fuentes solo cuando la representación las requiera. Los pasos que usan solo texto, herramientas integradas o HTML autocontenido no requieren instalación de paquetes; el acceso a herramientas externas o la autenticación debe manejarse a través del anfitrión, no de un gestor de paquetes.

Convenciones de ruta y entorno de ejecución (leer antes de ejecutar comandos)

  • Comando Python: en esta máquina se usa python (en Windows normalmente no existe python3). Todos los comandos a continuación usarán python de forma uniforme.
  • Ruta de scripts: los scripts de esta skill se encuentran en AppData/skills/pptx/scripts/ (relativo a la raíz del proyecto). Los comandos de scripts en este documento y en editing.md / pptxgenjs.md ya están escritos como rutas absolutas relativas a ese directorio base; se pueden ejecutar directamente desde la raíz del proyecto.
  • Directorio de trabajo: los comandos asumen que el directorio de trabajo actual es la raíz del proyecto. Si el directorio de trabajo es diferente (por ejemplo, default_workdir se cambió a otro directorio), reemplaza AppData/skills/pptx con la ruta absoluta del directorio de la skill.
  • Node.js: antes de ejecutar npm/node (necesario para pptxgenjs), añade el directorio de Node.js al PATH según las reglas del proyecto.

PPTX Skill

Referencia rápida

TareaGuía
Leer/analizar contenidopython -m markitdown presentacion.pptx
Editar o crear desde plantillaLee editing.md — QA: validate_layout.py + markitdown
Crear desde cero1. Planificar contenido → 2. Pre-generar activos → 3. Leer pptxgenjs.md
Evitar desbordamiento por diseñoLee pptxgenjs.md
Generar sistema de diseñopython AppData/skills/pptx/scripts/design/search.py "<tema>" --design-system
Corrección post-generaciónpython AppData/skills/pptx/scripts/fix_pptx.py salida.pptx
QA de maquetación (crítico primero)python AppData/skills/pptx/scripts/validate_layout.py presentacion.pptx

Lectura de contenido

# Extracción de texto
python -m markitdown presentacion.pptx

# XML sin procesar
python AppData/skills/pptx/scripts/unpack.py presentacion.pptx desempaquetado/

Flujo de edición

Lee editing.md para obtener todos los detalles.

  1. Analiza la plantilla con markitdown
  2. Desempaqueta + verifica capa de estilo + plan de alineación de Tema y Estilo
  3. Manipula diapositivas → edita contenido → limpia → empaqueta
  4. ⚠️ QA de maquetación (puerta obligatoria): python AppData/skills/pptx/scripts/validate_layout.py salida.pptx --slides <numeros_diapositivas_editadas>
  5. ⚠️ QA de contenido (obligatorio): python -m markitdown salida.pptx

Creación desde cero

Lee pptxgenjs.md para obtener todos los detalles.

Úsalo cuando no haya disponible una plantilla o presentación de referencia.

Estructura de diapositivas requerida (solo creación desde cero)

Al crear una presentación desde cero, DEBES seguir esta estructura:

  1. Diapositiva 1: Portada
  2. Diapositiva 2: Índice (agenda)
  3. Diapositiva 3 en adelante: Secciones de contenido en el orden exacto listado en la Diapositiva 2
  4. Diapositiva final: Cierre/página de agradecimiento

No omitas la diapositiva de índice. No coloques diapositivas de contenido antes del índice.

⚠️ No se permiten diapositivas en blanco

Toda diapositiva DEBE contener al menos un elemento visible (addText, addShape, addImage, addChart o addTable) dentro de la diapositiva. Una diapositiva con solo un color de fondo y sin elementos de contenido es un defecto de generación.

Causas comunes de diapositivas en blanco:

  • Olvidar añadir contenido a diapositivas de separación de sección / transición
  • Truncamiento de tokens a mitad de la generación que deja algunas diapositivas vacías
  • Asumir que el diseño o patrón de diapositiva llenará automáticamente el contenido (no lo hará — pptxgenjs crea diseños mínimos sin formas heredadas)

Si tu intención es que una diapositiva sea un separador de sección, DEBES añadir elementos explícitamente — por ejemplo, un número de sección grande, texto de título y/o formas decorativas.


⚠️ OBLIGATORIO: Planificación previa a la generación

Antes de escribir cualquier código, DEBES completar estos pasos de planificación:

⚡ Ruta rápida para solicitudes simples: Cuando el usuario solicite una presentación corta/simple (≤ 6 páginas, un solo tema, sin diagramas complejos), omite el resultado formal de planificación y ve directamente al Paso 3 (escribe código) usando la estructura estándar Portada + Índice + (N-3) Contenido + Cierre. Ruta rápida = sin plan verboso en tu respuesta, solo construye y ejecuta el script.

Paso 1: Generar el plan de diseño de contenido

Presenta un plan estructurado que cubra:

  1. Tema y estilo general

    • Elección de paleta de colores (consulta la sección "Ideas de diseño")
    • Combinación tipográfica
    • Motivo visual que se repite en todas las diapositivas
  2. Esquema diapositiva por diapositiva

    Diapositiva 1: Portada - Tipo de diseño, elementos clave
    Diapositiva 2: Índice - Lista ordenada de secciones
    Diapositiva 3: [Sección 1 del índice] - Tipo de diseño, elementos clave, plan de información (si es visual)
    ...
    Diapositiva N: Cierre / Gracias - Tipo de diseño, elementos clave
    ...
    
  3. Inventario de elementos visuales

    • Enumera todas las imágenes, iconos, gráficos y diagramas necesarios
    • Marca cada uno como: [Integrado] (formas/gráficos de pptxgenjs) o [Externo] (necesita pre-generación)

Ejemplo de resultado de planificación:

## Plan de presentación

**Tema:** Paleta Océano Gradiente (065A82, 1C7293, 21295C)
**Fuentes:** Georgia (títulos) + Calibri (cuerpo)
**Motivo:** Tarjetas redondeadas con borde de acento izquierdo

### Diapositivas:
1. Portada - Título centrado, fondo degradado
2. Índice - Resumen / Arquitectura / Métricas / Cronología
3. [Sección 1 del índice] - Tipo de diseño, elementos clave, plan de información (si es visual)
...
n. Cierre - Mensaje de cierre + contacto

⚠️ Después de generar tu plan, procede INMEDIATAMENTE al Paso 2 y Paso 3. No replanifiques, no repitas el mismo esquema con variaciones menores. Genera el plan UNA VEZ, luego comienza a escribir código pptxgenjs.

Paso 2: Pre-generar activos externos

Para las figuras marcadas como [Externo], genéralas ANTES de escribir el código pptxgenjs.

⚠️ CRÍTICO: Coherencia de color

Todos los diagramas y gráficos generados DEBEN usar la misma paleta de colores que la presentación. Define los colores al inicio de tu script de generación basándote en el tema elegido.

Opción A: Formas/gráficos nativos primero (predeterminado OBLIGATORIO)

TODOS los diagramas de arquitectura, diagramas de flujo, diagramas de procesos, organigramas y diagramas de relaciones DEBEN construirse con formas nativas de pptxgenjs (RECTANGLE, OVAL, LINE, conectores + addText). Consulta pptxgenjs.md "Construcción de diagramas con formas nativas" para ver patrones y ejemplos.

  • Usa una diapositiva de plantilla sólida (proceso, comparación, 2 columnas, cuadrícula de iconos) cuando sea adecuado
  • Usa formas nativas de pptxgenjs (cajas/flechas/líneas + texto) para flujos, arquitecturas y jerarquías
  • Usa gráficos de pptxgenjs para gráficos de datos simples (barras, circulares, líneas, etc.)

Recurre a matplotlib solo para gráficos estadísticos complejos (mapas de calor, diagramas de dispersión, diagramas de caja) que los gráficos de pptxgenjs no pueden manejar. Recurre a Mermaid solo cuando el diagrama sea demasiado complejo para formas nativas E involucre muchas conexiones cruzadas.

Opción B: Gráficos Matplotlib/Python

Define la paleta de colores al inicio para que coincida con tu tema PPT:

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

# ============================================================
# PALETA DE COLORES - Coincide con tu tema PPT
# ============================================================
# Ejemplo: tema "Océano Gradiente"
COLORES = {
    'primario': '#065A82',
    'secundario': '#1C7293',
    'acento': '#21295C',
    'fondo': '#F0F7FA',
    'texto': '#21295C',
    'claro': '#E8F4F8',
}

# Ciclo de colores para múltiples series de datos
CICLO_COLORES = [COLORES['primario'], COLORES['secundario'], COLORES['acento'], '#4A90A4', '#2D5A6B']

# Aplica el tema globalmente
plt.rcParams.update({
    'axes.prop_cycle': plt.cycler(color=CICLO_COLORES),
    'axes.facecolor': 'none',
    'axes.edgecolor': COLORES['texto'],
    'axes.labelcolor': COLORES['texto'],
    'text.color': COLORES['texto'],
    'xtick.color': COLORES['texto'],
    'ytick.color': COLORES['texto'],
    'figure.facecolor': 'none',
    'font.family': 'sans-serif',
    'font.size': 12,
})
# ============================================================

# Crea gráfico con colores del tema
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
barras = ax.bar(['T1', 'T2', 'T3', 'T4'], [25, 40, 35, 50],
              color=[COLORES['primario'], COLORES['secundario'], COLORES['primario'], COLORES['secundario']],
              edgecolor=COLORES['acento'], linewidth=1.5)
ax.set_title('Ingresos Trimestrales', fontsize=16, fontweight='bold', color=COLORES['texto'])
ax.set_ylabel('Ingresos ($M)', color=COLORES['texto'])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.tight_layout()
ancho_px, alto_px = int(8 * 150), int(5 * 150)
plt.savefig(f'grafico_{ancho_px}x{alto_px}.png', dpi=150, transparent=True)
plt.close()

Plantillas de paleta Matplotlib:

# Ejecutivo Nocturno
COLORES = {'primario': '#1E2761', 'secundario': '#CADCFC', 'acento': '#FFFFFF', 'texto': '#1E2761'}

# Bosque y Musgo
COLORES = {'primario': '#2C5F2D', 'secundario': '#97BC62', 'acento': '#F5F5F5', 'texto': '#2C5F2D'}

# Energía Coral
COLORES = {'primario': '#F96167', 'secundario': '#F9E795', 'acento': '#2F3C7E', 'texto': '#2F3C7E'}

# Terracota Cálido
COLORES = {'primario': '#B85042', 'secundario': '#E7E8D1', 'acento': '#A7BEAE', 'texto': '#B85042'}

# Confianza Turquesa
COLORES = {'primario': '#028090', 'secundario': '#00A896', 'acento': '#02C39A', 'texto': '#028090'}

Úsalo para:

  • Gráficos estadísticos complejos (barras, líneas, circulares, dispersión, radar, etc.)
  • Visualizaciones personalizadas no compatibles con pptxgenjs
  • Mapas de calor, diagramas de dispersión, diagramas de caja

⚠️ NO uses matplotlib para:

  • Diagramas de arquitectura
  • Diagramas de flujo / diagramas de procesos
  • Organigramas / diagramas jerárquicos
  • Diagramas de topología de red
  • Cualquier diagrama que muestre principalmente relaciones entre componentes

Estos DEBEN construirse con formas nativas de pptxgenjs para que se representen como objetos PPT editables, no como imágenes rasterizadas.

matplotlib - Gráficos con soporte CJK

Al crear gráficos con matplotlib que incluyan texto en chino, DEBES configurar la fuente:

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

def configurar_matplotlib_cjk():
    """Configura matplotlib para soportar caracteres CJK"""
    sistema = platform.system()

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

    # Encuentra fuente disponible
    fuentes_disponibles = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
    for nombre_fuente in nombres_fuentes:
        if nombre_fuente in fuentes_disponibles:
            plt.rcParams['font.sans-serif'] = [nombre_fuente] + plt.rcParams['font.sans-serif']
            plt.rcParams['axes.unicode_minus'] = False  # Corrige visualización del signo menos
            return nombre_fuente
    return None

# Configurar fuente CJK antes de crear gráficos
fuente_cjk = configurar_matplotlib_cjk()

# Crear un gráfico de barras con etiquetas en chino
categorias = ['第一季度', '第二季度', '第三季度', '第四季度']
valores = [120, 135, 142, 158]

plt.figure(figsize=(10, 6))
plt.bar(categorias, valores, color='steelblue')
plt.title('季度销售数据 Ventas Trimestrales', fontsize=16)
plt.xlabel('季度 Trimestre', fontsize=12)
plt.ylabel('销售额 Ventas', fontsize=12)
plt.tight_layout()
plt.savefig('grafico.png', dpi=150)
plt.close()

Opción C: Búsqueda web de imágenes

Busca imágenes relevantes cuando:
- Se necesiten fotos de stock o ilustraciones
- Se requieran iconos o logotipos
- Imágenes de referencia para conceptos

Opción D: Diagramas Mermaid (último recurso)

Úsalo solo cuando el diagrama no pueda representarse limpiamente con formas/diseños nativos, y mantenlo coherente con la presentación:

# Instalar si es necesario: npm install -g @mermaid-js/mermaid-cli

Crea un archivo de configuración de tema que coincida con tu paleta PPT:

// mermaid-config.json - Ejemplo para tema "Océano Gradiente"
{
  "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[Cliente] --> B[Puerta de enlace API]
    B --> C[Servicio A]
    B --> D[Servicio B]
EOF

# Prefiere exportación de alta resolución para uso en PPT
mmdc -i diagram.mmd -o diagram.png -c mermaid-config.json -b white -w 1600 --scale 2

Paso 3: Convención de nombres de imágenes (OBLIGATORIO)

Todas las imágenes generadas DEBEN incluir las dimensiones en el nombre del archivo:

{nombre}_{ancho}x{alto}.png

Ejemplos:

  • arquitectura_800x600.png - 800px de ancho, 600px de alto
  • cronologia_1200x400.png - 1200px de ancho, 400px de alto
  • grafico_600x600.png - 600px cuadrado

Al guardar imágenes, incluye siempre las dimensiones:

# Ejemplo Matplotlib
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
# ... crea el gráfico ...
ancho_px = int(8 * 150)   # 1200
alto_px = int(5 * 150)   # 750
plt.savefig(f'grafico_{ancho_px}x{alto_px}.png', dpi=150, transparent=True)
# Generi

...

[truncado para traducción]

Skills relacionados