From napa-doc-suite
NAPA-branded PowerPoint presentation builder using python-pptx with the NAPA Standard Slide Template. This is the ONLY correct method for creating NAPA presentations. Use when the user asks to "create a presentation", "build slides", "make a deck", "generate a PowerPoint", "create a pptx", or any presentation-related request. NEVER use the generic Anthropic pptx skill. This skill replaces it entirely.
npx claudepluginhub chadronbryant/napa-cowork-plugins --plugin napa-doc-suiteThis skill uses the workspace's default tool permissions.
> **CRITICAL**: This skill is the ONLY way to create NAPA presentations. NEVER invoke the generic Anthropic `pptx` skill (`/mnt/.skills/skills/pptx/SKILL.md`). It uses PptxGenJS from-scratch generation, which has failed 3 times and does not produce brand-compliant output.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
CRITICAL: This skill is the ONLY way to create NAPA presentations. NEVER invoke the generic Anthropic
pptxskill (/mnt/.skills/skills/pptx/SKILL.md). It uses PptxGenJS from-scratch generation, which has failed 3 times and does not produce brand-compliant output.
brand-standards skill for colors, fonts, and tonereferences/template-catalog.md for inspiration from existing template conceptsreferences/template-layout-catalog.md for the full layout inventory with placeholder mapsITSM Process and Standards/04 - Branding/NAPA Standard Slide Template - 2025.pptx
54 slides, 30 layouts. This is the ONLY template for NAPA presentations.
| Script | Slides | Location |
|---|---|---|
| ITSM Presentation | 17 | scripts/document-generation/build_pptx_from_template.py (636 lines, gold standard) |
| Jarvis Origin Story | 16 | Projects/Jarvis Origin Story/build_jarvis_origin_story.py |
| ServiceNow Roadmap | 20 | Projects/ServiceNow Roadmap/ (Layout 14 rebuild, Feb 2026) |
Copy the pattern from these scripts exactly for new presentations.
Every NAPA presentation uses this two-part approach:
Part 1: Keep design-rich template slides
KEEP_INDICES = {0, 2, 3, 4, 42}Part 2: Add custom content slides
Two approaches, depending on the slide type:
Approach A (Default): Use "Blank Content 07" (Layout 14) for fully custom slides
add_text, add_rect, add_header_bar, add_bulletsApproach B: Use structured NAPA layouts and fill ALL their placeholders
references/template-layout-catalog.md for the complete inventory with placeholder mapsReorder slides to desired sequence at the end.
DEFAULT CHOICE: When in doubt, use Layout 14 ("Blank Content 07"). Zero placeholders, full control.
| Layout | Name | Placeholders | Best For |
|---|---|---|---|
| 14 | Blank Content 07 | 0 (SAFE) | Default for all custom content |
| 0-1 | Title Slide 01-02 | 2 (idx 10, 11) | Opening slides (kept from template) |
| 2-4 | Divider Slide 01-03 | 1 (idx 10) | Section breaks (kept from template) |
| 5 | Agenda Slide 01 | 2 (idx 10, 11) | Simple agenda with title + content area |
| 6 | Agenda Slide 02 | 14 | 4-column numbered agenda sections |
| 10 | Blank Content 03 | 2 (idx 10, 11) | Title + full-width content area |
| 18 | Closing Slide | 1 (idx 0) | Closing (kept from template) |
| 19 | Timeline 01 | 18 | 7-point timeline with descriptions |
| 24-29 | Text 01-07 | 4-13 | Various text layouts (headline + body combos) |
Full catalog with positions and sizes: references/template-layout-catalog.md
These layouts have "Blank" in the name but contain placeholders that will show ghost text:
| Layout | Name | Placeholders | Risk |
|---|---|---|---|
| 8 | Blank Content 01 | 4 (includes image placeholder) | Shows "Insert Image" and "Click to add" |
| 9 | Blank Content 02 | 4 (includes image placeholder) | Shows "Insert Image" and "Click to add" |
| 11 | Blank Content 04 | 2 (idx 10, 11) | Shows title/subtitle ghost text |
| 12 | Blank Content 05 | 2 (idx 10, 11) | Shows title/subtitle ghost text |
| 13 | Blank Content 06 | 2 (idx 10, 11) | KNOWN FAILURE: ghost text bleeds behind custom shapes |
| 15 | Blank Content 08 | 6 | Shows multiple "Click to add" fields |
NEVER use Layout 13 ("Blank Content 06") for custom content. This was the root cause of the Feb 2026 ServiceNow Roadmap PPTX failure where "Click to add title" and "Click here to add sub-title" text appeared behind all custom shapes.
| Slide Type | Placeholder idx | Content |
|---|---|---|
| Title Slide | 10 | Main title text |
| Title Slide | 11 | Subtitle text |
| Divider Slides | 10 | Section title |
| Closing Slide | 0 | Company info |
Fill these with: for ph in slide.placeholders: if ph.placeholder_format.idx == 10:
MINIMUM READABLE SIZE: 11pt. Never go below 11pt for any text a viewer needs to read. Sizes of 7-9pt were used in prior builds and confirmed too small to read in presentations.
| Element | Size | Notes |
|---|---|---|
| Title slide title | 24pt | Fits within idx=10 bounds |
| Title slide subtitle | 14pt | Fits within idx=11 bounds |
| Divider titles | 36pt | Large, bold section headers |
| Content headers | 28pt | White text on blue header bar |
| Body text / bullets | 14-16pt | Main readable content (never below 13pt) |
| Sub-headers | 16-18pt | Emphasis within slides |
| Metric numbers | 42-44pt | Large callout stats |
| Metric labels | 12-13pt | Below metric numbers |
| Table cell text | 11-13pt | Minimum 11pt for readability |
| Captions / footnotes | 11pt | Minimum readable size |
| Source attributions | 11pt | Bottom-of-slide references |
Rule of thumb: If you find yourself going below 11pt, the slide has too much content. Split it into two slides instead.
import shutil
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN
from pptx.enum.shapes import MSO_SHAPE
# === NAPA CONSTANTS ===
TEMPLATE = "ITSM Process and Standards/04 - Branding/NAPA Standard Slide Template - 2025.pptx"
OUTPUT = "output.pptx"
KEEP_INDICES = {0, 2, 3, 4, 42}
BLUE = RGBColor(0x00, 0x51, 0x95)
ORANGE = RGBColor(0xFF, 0xA3, 0x00)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_BLUE = RGBColor(0x00, 0x33, 0x66)
GRAY = RGBColor(0x66, 0x66, 0x66)
LIGHT_GRAY = RGBColor(0xF5, 0xF5, 0xF5)
FONT = "Arial"
SW = 13.33 # slide width inches
SH = 7.5 # slide height inches
MIN_FONT = 11 # Minimum readable font size in pt
# === HELPER FUNCTIONS ===
# (See references/helper-functions.md for full set)
# === BUILD ===
shutil.copy2(TEMPLATE, OUTPUT)
prs = Presentation(OUTPUT)
# 1. Delete non-kept slides (reverse order)
all_idx = list(range(len(prs.slides)))
del_idx = sorted([i for i in all_idx if i not in KEEP_INDICES], reverse=True)
for i in del_idx:
delete_slide(prs, i)
# 2. Fill template placeholders
# 3. Add custom content slides using Layout 14 ("Blank Content 07")
blank_layout = get_layout(prs, "Blank Content 07") # Layout 14, 0 placeholders
slide = prs.slides.add_slide(blank_layout)
# 4. Reorder slides
# 5. Save
prs.save(OUTPUT)
shutil.copy2 the template first, then open the copyph.top = ...). Adjust font size instead.'{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id'| Failure | Cause | Fix |
|---|---|---|
| Ghost "Click to add" text behind content | Used a layout with placeholders without filling them | Use Layout 14 ("Blank Content 07") or fill ALL placeholders |
| "Click to add subtitle" on template slides | Text boxes overlaid instead of filling placeholders | Use ph.placeholder_format.idx to fill |
| Numbered boxes (01, 02, 03) behind content | Used Agenda or structured layout without filling all fields | Switch to Layout 14, or fill every placeholder |
| No NAPA design elements | Only kept title slide | Keep ALL 5 indices |
| Text disappears in LibreOffice | Repositioned template placeholders | Never change ph position |
| Wrong font | Used Calibri | Always use Arial |
| Slide deletion corrupts file | Wrong namespace URI | Use full namespace string |
| Text too small to read | Used 7-9pt for body/caption text | Minimum 11pt for all readable text |
Check references/template-catalog.md for presentation concept templates. To borrow a concept from an existing template:
| File | Purpose |
|---|---|
references/helper-functions.md | Full helper function library with code |
references/template-catalog.md | Presentation concept templates for inspiration |
references/template-layout-catalog.md | Complete layout inventory with placeholder maps, positions, sizes, and usage guidance |