Awesome-omni-skill pptx
Generates PowerPoint presentations from templates with consistent styling across tables, charts, and Mermaid diagrams. Use when creating PPTX files, working with template-based presentations, or applying unified styling from style.yaml. Supports Python, R, and native PowerPoint shapes.
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/fullstack-web/pptx" ~/.claude/skills/diegosouzapw-awesome-omni-skill-pptx-323421 && rm -rf "$T"
skills/fullstack-web/pptx/SKILL.mdPPTX Skill (Template-based)
0. Scope & Prerequisites
This skill is template-first and uses style.yaml as Single Source of Truth.
- ✅ ALWAYS reference TEMPLATE.md for layout selection - different layouts have different placeholder indices
- ✅ Always begin with
template.pptx - ✅ Extract styles from
andChart.crtx
intotemplate.pptxstyle.yaml - ✅ Use consistent styling across Python, R, and Mermaid
1. Working Directory Structure
To keep the skill directory clean, all working files should be placed in a separate project directory:
{project}/ └── powerpoint/ # All PowerPoint-related files (auto-created) ├── outline.md # Content definition (input, human-edited) ├── generate_*.py # Generation script (AI-created, preserved for reference) ├── output.pptx # Final output └── processing/ # Temporary files and generation logs (safe to delete) ├── snapshot/ # Generation-time snapshots (for audit/reproducibility) │ ├── template.pptx # Template used at generation time │ ├── template.crtx # Chart template used at generation time │ ├── style.yaml # Style config used at generation time │ ├── TEMPLATE.md # Layout documentation used at generation time │ └── timestamp.txt # Generation timestamp and skill version ├── pptx_generation.log # Debug logs (auto-generated) ├── charts/ # R-generated SVG/PNG (optional) ├── diagrams/ # Mermaid-generated SVG (optional) └── temp/ # Other temporary files (optional)
Directory Roles
- powerpoint/outline.md - Markdown file defining slide content and structure (human-edited input, high-level design)
- powerpoint/generate_*.py - Python script that generates the presentation (AI-created from outline.md, preserved for reference)
- powerpoint/output.pptx - Final generated PowerPoint presentation (output)
- powerpoint/processing/ - Temporary/intermediate files and logs (can be safely deleted, but useful for audit)
- snapshot/ - Snapshots of templates/styles used at generation time (for reproducibility and audit)
- pptx_generation.log - Detailed debug and error logs (auto-generated)
Setup
No manual setup required! The generation script automatically:
- Creates
directory structurepowerpoint/processing/ - Copies templates to
for audit loggingprocessing/snapshot/ - Initializes logging to
processing/pptx_generation.log
Optional: Create subdirectories for R charts or Mermaid diagrams if needed:
mkdir -p powerpoint/processing/{charts,diagrams,temp}
Logging (Automatic)
All PPTX generation activities are automatically logged to
powerpoint/processing/pptx_generation.log:
- Auto-detection: Finds
directory automaticallypowerpoint/processing/ - Console: Shows warnings/errors only
- Log file: Records all debug information, validation errors, and styling issues
No manual setup required - logging initializes on first use of table/chart creation functions.
1.5. outline.md Format
The
outline.md file defines presentation content at a high level. AI reads this file and generates a corresponding Python script (generate_*.py) that creates the PowerPoint presentation.
Format Specification
IMPORTANT: Every slide MUST specify its layout explicitly using the
**Layout**: field.
# Presentation Title --- ## Slide 1: [Slide Title] **Layout**: 0 (00_Title) - タイトル: [Main Title Text] - サブタイトル: [Subtitle Text] - 副題: [Additional Subtitle] (optional) --- ## Slide 2: [Section Title] **Layout**: 2 (02_Section) - タイトル: [Section Title] --- ## Slide 3: [Table Slide Title] **Layout**: 7 (Handout_Single_Table_Pos) - タイトル: [Slide Title] - KeyMessage: [Key message] ### [Table Title] | Column 1 | Column 2 | Column 3 | |----------|----------|----------| | Data 1A | Data 1B | Data 1C | | Data 2A | Data 2B | Data 2C | --- ## Slide 4: [Chart Slide Title] **Layout**: 5 (Handout_Single_Chart_Pos) - タイトル: [Slide Title] - KeyMessage: [Key message] ### [Chart Description] - グラフ: [Chart type and description] - データ: [Data description or actual values] --- ## Slide 5: [Text Content Slide] **Layout**: 11 (Handout_Single_Object_Pos) - タイトル: [Slide Title] - KeyMessage: [Key message] ### [Content] - **[Point 1]** - [Detail 1] - [Detail 2] - **[Point 2]** - [Detail 1] - [Detail 2]
Layout Selection Guidelines:
- 0 (00_Title) - Opening slide with title and subtitle
- 1 (01_Contents) - Table of contents or text-focused slides
- 2 (02_Section) - Section dividers
- 5 (Handout_Single_Chart_Pos) - Full-width chart with key message
- 7 (Handout_Single_Table_Pos) - Full-width table with key message
- 11 (Handout_Single_Object_Pos) - Full-width content (text, diagrams, etc.)
For complete layout reference, see
~/.claude/skills/pptx/templates/TEMPLATE.md
AI Workflow
When AI creates
outline.md:
- MUST specify Layout for every slide - Reference TEMPLATE.md to choose appropriate layout
- Use layout name format:
**Layout**: [number] ([name])- Example:
**Layout**: 7 (Handout_Single_Table_Pos)
- Example:
- Select layout based on content type:
- Title slide → Layout 0
- Section divider → Layout 2
- Table → Layout 7
- Chart → Layout 5
- Text/Objects → Layout 11
When AI processes
outline.md to generate presentation:
- Reads outline.md - Extracts layout number and content
- References TEMPLATE.md - Looks up placeholder indices for specified layout
- Generates generate_*.py - Creates Python script with:
- Layout from outline.md (e.g.,
)prs.slide_layouts[7] - Correct placeholder indices from TEMPLATE.md (e.g.,
for TABLE)placeholders[16] - Structured data specifications (table_spec, chart_spec)
- Styling via
andcreate_styled_table()create_styled_chart()
- Layout from outline.md (e.g.,
- Executes script - Runs
to createpython generate_*.pyoutput.pptx
Information AI Supplements
AI automatically determines technical details not explicitly in
outline.md:
- Placeholder indices (from TEMPLATE.md based on specified layout)
- Content structure (converting bullet lists to table_spec)
- Chart types (inferring from context)
- Specific data values (if not provided)
Note: Layout numbers are now explicitly specified in outline.md, not inferred by AI.
Example Mapping
outline.md (AI creates with Layout specified):
## Slide 2: 課題認識 **Layout**: 7 (Handout_Single_Table_Pos) - タイトル: こんな課題はありませんか? - KeyMessage: 新規事業の成否は「人」に依存するが... ### 3つの課題 1. **異動・採用の判断** - この候補者はイノベーションに向いているか?
AI generates in generate_*.py (based on specified Layout 7):
# Uses Layout 7 as specified in outline.md slide = prs.slides.add_slide(prs.slide_layouts[7]) slide.shapes.title.text = "こんな課題はありませんか?" # References TEMPLATE.md: Layout 7 has KeyMessage at idx=13 slide.placeholders[13].text = "新規事業の成否は..." table_spec = { 'data': [ ['課題', '具体的な悩み'], # AI structures bullet list as table ['異動・採用の判断', '• この候補者は...'], ... ], 'header_row': True } # References TEMPLATE.md: Layout 7 has TABLE at idx=16 create_styled_table(slide, slide.placeholders[16], table_spec)
Human Editing Workflow
When a human edits
outline.md:
- Change Layout: Modify
**Layout**: [number] ([name])- Example: Change from Layout 7 (table) to Layout 5 (chart)
- Adjust Content: Update content to match new layout
- Regenerate: Ask AI to regenerate
from modified outline.mdgenerate_*.py - Execute: Run
to create updated presentationpython generate_*.py
2. Files and Roles
Core Files
- templates/template.pptx - Slide layouts, theme colors/fonts (human-edited, shared across projects)
- templates/template.crtx - Chart template with styling (human-edited, shared across projects)
- templates/style.yaml - Master style definitions (auto-generated from templates, shared across projects)
- templates/TEMPLATE.md - Layout documentation (auto-generated from template.pptx, used by AI for layout selection)
- {project}/powerpoint/processing/snapshot/* - Snapshots of templates/styles/docs used at generation time (auto-copied for audit)
Scripts
- scripts/extract_style.py - Generate style.yaml from templates
- scripts/style_config.py - Python style loader
- scripts/style_config.R - R style loader
- scripts/mermaid_to_shapes.py - Mermaid → native PowerPoint shapes
- scripts/native_objects.py - Native table/chart/diagram creation (with validation & logging)
- scripts/crtx_utils.py - Chart.crtx utilities (with detailed error logging)
- scripts/logging_utils.py - Auto-configured logging to processing/pptx_generation.log
- scripts/layout_registry.py - Layout management
- scripts/generate_template.py - TEMPLATE.md auto-generation (maintenance tool)
3. Style System
Generate Master Style (templates/style.yaml)
When you update
template.pptx or template.crtx, regenerate the master style:
cd ~/.claude/skills/pptx python scripts/extract_style.py
This extracts styling from:
- Series colors, axes, legend, data labelstemplates/template.crtx
Slide 1 - Table stylingtemplates/template.pptx
Slide 2 - Flowchart/diagram stylingtemplates/template.pptx
Output:
templates/style.yaml (master template)
Generation-Time Snapshots
For audit and reproducibility, the system snapshots templates/styles at generation time:
- Auto-snapshot: On each generation, copies current templates to
powerpoint/processing/snapshot/
- The template file usedtemplate.pptx
- The chart template usedtemplate.crtx
- The style configuration usedstyle.yaml
- Generation timestamp and skill versiontimestamp.txt
- Purpose: Audit trail showing exactly which templates produced the output
- Regeneration: Always uses latest templates from
(not the snapshot)~/.claude/skills/pptx/templates/ - Benefit: You can diff snapshots to see how template changes affect output over time
style.yaml Structure
colors: primary: "#4F4F70" series: - type: rgb value: "#4F4F70" - type: theme value: bg1 brightness: -0.25 category_axis: visible: true font: size_pt: 11 color_type: theme color_value: tx1 brightness: 0.35 value_axis: visible: false legend: position: bottom font: size_pt: 11 table: header: fill_theme: bg1 fill_brightness: -0.5 body: column_brightness: [-0.15, -0.05, -0.05, -0.05] flowchart: node: fill: "#4F4F70" shadow: enabled: false connector: type: elbow dash_style: solid
4. Usage
Creating Presentations (REQUIRED)
IMPORTANT: Always use
native_objects.py for creating tables and charts. This ensures:
- Complete styling from
template is applied.crtx - Automatic data validation
- Detailed error logging to
powerpoint/processing/pptx_generation.log
CRITICAL: Different layouts have different placeholder indices. Always check TEMPLATE.md or use the debug script to find the correct idx for your layout.
import sys import os sys.path.insert(0, os.path.expanduser('~/.claude/skills/pptx')) from pptx import Presentation from scripts.native_objects import create_styled_table, create_styled_chart # Load template skill_dir = os.path.expanduser('~/.claude/skills/pptx') template_path = os.path.join(skill_dir, 'templates', 'template.pptx') prs = Presentation(template_path) # Example 1: Create a chart slide (use Layout 5) slide = prs.slides.add_slide(prs.slide_layouts[5]) # Handout_Single_Chart_Pos slide.shapes.title.text = "Sales Report" slide.placeholders[13].text = "Q1-Q4 performance analysis" # Chart placeholder is idx=15 for this layout chart_spec = { 'chart_kind': 'column', # 'line', 'bar', 'pie' 'categories': ['Q1', 'Q2', 'Q3', 'Q4'], 'series': [ {'name': 'Sales', 'values': [100, 120, 110, 130]}, {'name': 'Cost', 'values': [80, 90, 85, 95]} ] } create_styled_chart(slide, slide.placeholders[15], chart_spec) # Example 2: Create a table slide (use Layout 7) slide = prs.slides.add_slide(prs.slide_layouts[7]) # Handout_Single_Table_Pos slide.shapes.title.text = "Summary Data" slide.placeholders[13].text = "Key metrics overview" # Table placeholder is idx=16 for this layout table_spec = { 'data': [ ['項目', '値A', '値B'], ['データ1', '100', '200'], ['データ2', '150', '250'] ], 'header_row': True } create_styled_table(slide, slide.placeholders[16], table_spec) prs.save('powerpoint/output.pptx')
Reading Styles (Advanced)
For custom styling beyond native objects, use
StyleConfig:
from scripts.style_config import StyleConfig # Auto-detects: templates/style.yaml (master) style = StyleConfig.load() primary = style.colors['primary'] # '#4F4F70' table_config = style.table # Or specify path explicitly: style = StyleConfig.load('~/.claude/skills/pptx/templates/style.yaml')
StyleConfig.load() behavior:
- Always loads from
(master template)~/.claude/skills/pptx/templates/style.yaml - Generation snapshots are saved to
for audit onlyprocessing/snapshot/style.yaml - No project-specific customization - all styling comes from the master template
WARNING: Using
StyleConfig directly requires manual application of all styles. Prefer native_objects.py instead.
R
source("scripts/style_config.R") style <- load_style("style.yaml") colors <- get_series_colors(style, 3)
Mermaid → Native Shapes
from scripts.mermaid_to_shapes import create_flowchart_shapes code = """flowchart LR A[Start] --> B{Decision} B -->|Yes| C[Action] B -->|No| D[End]""" create_flowchart_shapes(slide, placeholder, code)
5. Render Modes
| Type | Mode | Description | Editable |
|---|---|---|---|
| TABLE | NATIVE | python-pptx table | ✅ |
| CHART | NATIVE | python-pptx with Chart.crtx | ✅ |
| DIAGRAM | NATIVE | Mermaid → native shapes | ✅ |
Note: All rendering uses NATIVE mode for maximum editability in PowerPoint.
6. Template Layouts
IMPORTANT: For complete layout reference, see TEMPLATE.md.
TEMPLATE.md provides:
- All 124 available layouts with detailed descriptions
- Naming convention:
{Usage}_{Layout}_{Content}_{Variant} - Selection guidelines for Handout vs Preso layouts
- AI guidelines for outline.md creation
Quick Reference
Foundation Layouts:
:0
- Opening slide00_Title
:1
- Table of contents01_Contents
:2
- Section divider02_Section
Common Layouts:
:0
- Title slide00_Title
:5
- Full-width chart with key messageHandout_Single_Chart_Pos
:7
- Full-width table with key messageHandout_Single_Table_Pos
:11
- Full-width object (for Mermaid diagrams)Handout_Single_Object_Pos
:66
- Presentation mode chartPreso_Single_Chart_Pos
Key Placeholder Indices (vary by layout - check TEMPLATE.md):
: TITLE (most layouts)idx=0
: KeyMessage (most content layouts)idx=13
: CHART (chart layouts like 5, 6)idx=15
: TABLE (table layouts like 7, 8)idx=16
: OBJECT (object layouts like 11, 12)idx=1
IMPORTANT: Always reference TEMPLATE.md for exact placeholder indices for each layout.
7. Dependencies
Python
pip install python-pptx lxml pyyaml pillow
R
install.packages(c("ggplot2", "yaml", "dplyr", "tidyr"))
Mermaid (optional)
npm install -g @mermaid-js/mermaid-cli
8. Workflow Example
Complete Example
#!/usr/bin/env python3 import sys import os sys.path.insert(0, os.path.expanduser('~/.claude/skills/pptx')) from pptx import Presentation from pptx.util import Pt from pptx.enum.text import PP_ALIGN from scripts.native_objects import create_styled_table, create_styled_chart # Setup (run once in project directory) # mkdir -p powerpoint/processing/{charts,diagrams,temp} # cp ~/.claude/skills/pptx/templates/template.pptx powerpoint/ # Load template prs = Presentation('template.pptx') # Delete existing slides while len(prs.slides) > 0: rId = prs.slides._sldIdLst[0].rId prs.part.drop_rel(rId) del prs.slides._sldIdLst[0] # Slide 1: Title slide slide = prs.slides.add_slide(prs.slide_layouts[0]) slide.shapes.title.text = "Presentation Title" slide.placeholders[1].text = "Subtitle\nDate" # Slide 2: Chart slide (use Layout 5 for charts) slide = prs.slides.add_slide(prs.slide_layouts[5]) # Handout_Single_Chart_Pos slide.shapes.title.text = "Chart Example" slide.placeholders[13].text = "Key message about this chart" # Chart placeholder is idx=15 chart_spec = { 'chart_kind': 'column', 'categories': ['Q1', 'Q2', 'Q3', 'Q4'], 'series': [ {'name': 'Sales', 'values': [100, 120, 110, 130]}, {'name': 'Cost', 'values': [80, 90, 85, 95]} ] } create_styled_chart(slide, slide.placeholders[15], chart_spec) # Slide 3: Table slide (use Layout 7 for tables) slide = prs.slides.add_slide(prs.slide_layouts[7]) # Handout_Single_Table_Pos slide.shapes.title.text = "Table Example" slide.placeholders[13].text = "Summary statistics" # Table placeholder is idx=16 table_spec = { 'data': [ ['Item', 'Value A', 'Value B', 'Total'], ['Product 1', '100', '200', '300'], ['Product 2', '150', '250', '400'] ], 'header_row': True } create_styled_table(slide, slide.placeholders[16], table_spec) # Save prs.save('powerpoint/output.pptx') print("✅ Presentation created: powerpoint/output.pptx") print("📋 Check logs: cat powerpoint/processing/pptx_generation.log")
R Charts (Advanced)
For complex ggplot2 charts, use R with style.yaml:
source("~/.claude/skills/pptx/scripts/style_config.R") style <- load_style("powerpoint/processing/style.yaml") p <- ggplot(data, aes(x, y)) + geom_bar(fill = get_primary_color(style)) + theme_style(style) # Save as PNG and insert manually into PowerPoint ggsave("powerpoint/processing/charts/chart.png", p, width = 10, height = 6, dpi = 300)
9. Troubleshooting
Check Logs
If tables or charts fail to generate correctly:
cat powerpoint/processing/pptx_generation.log
Common Issues
Table creation fails
- Log shows:
→ Check data array consistencyRow X has Y columns, expected Z - Log shows:
→ Verify data is not emptyTable spec.data is empty
Chart creation fails
- Log shows:
→ All chart values must be numbersSeries 'X' contains non-numeric value - Log shows:
→ Template path issue (auto-fixed in latest version)Chart.crtx not found - Log shows:
→ Check style.yaml theme color definitionsUnknown theme color 'accentX'
Styling not applied
- Log shows:
→ Check template.crtx compatibilityFailed to apply category axis styling - Console shows warnings → Check
for detailspowerpoint/processing/pptx_generation.log
Error Prevention
All input data is now validated:
- Table: Column count consistency, non-empty data
- Chart: Numeric values, matching series/category lengths, non-empty series
- Template paths use absolute paths (no longer dependent on working directory)