xorbitsai/xagent/presentation-generator

Claude Code and agent skill by xorbitsai/xagent

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Create, read, or edit PowerPoint .pptx files: slide decks from scratch, content extraction, templates, speaker notes, combining or splitting decks. Not for posters, images, or social graphics.

Install

npx vskill@latest install xorbitsai/xagent/presentation-generator

SKILL.md

Presentation Generator

Generate PowerPoint presentations using JavaScript code with the pptxgenjs library.

Google Slides output

When the requested output is Google Slides, this skill is the local deck creation step, not the final delivery step:

  1. Generate and inspect the designed local PPTX in the workspace.
  2. Call google_slides_import_pptx with that PPTX path to convert it into an

editable native Google Slides presentation. Treat validation_failed as a failed delivery; it means the conversion changed the slide count, dropped text, or left a blank slide.

  1. Call google_slides_get_presentation to verify slide count and text before

returning the Google Slides link.

Do not build a new outlined deck with repeated google_slides_create_presentation and google_slides_add_slide calls. Those tools are for explicitly requested simple text/layout edits and do not preserve visual design.

For simple Google Slides layout edits, when google_slides_create_presentation returns a default_slide_id (it is null when there is no default page to replace), pass it to the first google_slides_add_slide call. Unless the user specified a different first slide, make that first slide the cover (layout="TITLE" with the deck title). Calls may run in separate MCP processes; without the id the connector only removes a sole page that has no elements at all, so a default page with placeholders stays as the first slide. google_slides_create_presentation writes the deck title into that page when it can, so it then reads as a title-only cover: do not add a second cover in that case. An empty page in a multi-page deck is preserved. Pass preserve_blank_slide=true when that sole page is intentional. google_slides_add_slide only supports layouts with title/body placeholders; use google_slides_batch_update directly for blank/custom slides.

When using google_slides_batch_update after google_slides_create_presentation, the connector cannot infer the default page across MCP processes. Include a deleteObject request for the returned default_slide_id, when one is returned, after creating the first content page, or use google_slides_add_slide with that ID.

⚠️ CRITICAL REQUIREMENTS - READ FIRST

YOU MUST FOLLOW THESE RULES - NO EXCEPTIONS:

  1. ONLY use the 4 predefined themes below (NOVA, ORBIT, PULSE, MINIMA)
  2. NEVER create custom color variables like const colorAccent = "0078D7"
  3. NEVER use hardcoded hex values in your code - always reference theme.xxx
  4. ALWAYS include the `#` prefix in hex colors (e.g., #EF4444 not EF4444)
  5. Slide 0 (first slide) MUST also be created via `const slide = pres.addSlide()` and use theme.cover - first slide is the cover with dark/high-contrast background
  6. Slides 1+ MUST use `theme.content` - all other slides use light/readable background

WRONG:

javascript
const colorAccent = "0078D7"; // ❌ WRONG - custom color
slide1.addText("Title", { color: "363636" }); // ❌ WRONG - hardcoded hex
const slide1 = pres.addSlide();
slide1.background = { color: theme.cover.background }; // ❌ WRONG - cover on non-first slide

CORRECT:

javascript
const theme = {
cover: {
background: '#0A0F1C',
title: '#FFFFFF',
subtitle: '#94A3B8',
accent: '#7C3AED'
},
content: {
background: '#F6F7FB',
primary: '#0A0F1C',
secondary: '#5B6475',
accent: '#7C3AED',
text: '#0A0F1C'
}
};
// Slide 0 (cover) — pptxgenjs requires addSlide() for the FIRST slide too
const slide1 = pres.addSlide();
slide1.background = { color: theme.cover.background };
slide1.addText("Title", { color: theme.cover.title });
// Slide 1+ — call pres.addSlide() to get each new slide
const slide2 = pres.addSlide();
slide2.background = { color: theme.content.background };
slide2.addText("Content", { color: theme.content.primary });

Execution Rules

CRITICAL: MANDATORY constraints for stable presentation generation:

  1. USE PREDEFINED THEMES ONLY: You MUST use one of the 4 predefined themes (NOVA, ORBIT, PULSE, MINIMA) from the "Predefined Themes" section below. NEVER define custom colors or use hardcoded hex values like "003366" or color: "FF0000".
  1. Theme Object Format: Always define theme as:

``javascript const theme = { background: '#XXXXXX', primary: '#XXXXXX', secondary: '#XXXXXX', accent: '#XXXXXX', text: '#XXXXXX' }; ` Then reference colors as theme.background, theme.primary`, etc.

  1. Slide Creation: ALWAYS call pres.addSlide() before adding content to ANY slide, including the FIRST one. Capture its return value: const slide = pres.addSlide(); then call slide.addText(...), slide.background = {...}, slide.addImage(...), etc. Calling pres.addText(...) or setting pres.background directly on the presentation object will throw pres.addText is not a function.
  1. Font Consistency: Keep font sizes consistent: titles 40-56pt, subtitles 24-32pt, body text 16-20pt
  1. Slide Bounds: Never position elements outside 10 x 7.5 inch slide area (x: 0-10, y: 0-7.5)
  1. Layout Simplicity: Prefer clean, simple layouts over dense or decorative designs
  1. Theme Selection: Choose theme based on presentation context (see Theme Selection Guide below)
  1. Visual Hierarchy: Slides must follow clear visual hierarchy: Title → Section Heading → Body → Accent Highlight. Avoid mixing too many font sizes on a single slide.
  1. Image Sizing: ALWAYS specify both width AND height, or use sizing to ensure images stay within bounds:
  • Use w and h together to control exact dimensions
  • Or use sizing: { type: 'contain', w: 8, h: 5 } to fit within bounds while maintaining aspect ratio
  • NEVER use only w or only h without the other - image may overflow
  • Keep images within content area: x: 0-10, y: 0-7.5 inches
  1. Handle Execution Failures Honestly: execute_javascript_code returns

{ success, output, error }. When success is false (or error is non-empty), the script aborted before writeFile and no .pptx was created. You MUST:

  • Tell the user the generation failed and quote the error message.
  • NOT claim the presentation was generated. NOT emit a [name.pptx]()

link to a file that does not exist.

  • Fix the JavaScript and retry (most failures are validation errors from

pptxgenjs — addTable row shape, missing slide handle, malformed options object — see "Data Table" below for the table pattern).

Layout Zones

For consistent slide layouts:

ZoneX/Y RangePurpose
Safe content areax: 0.5-9.5, y: 0.5-7Main content, images, data
Title areay: 0.5 - 1.5Slide titles and headings
Content areay: 1.5 - 5.5Main content, bullets, data
Footer areay: 6.0 - 7.0Footer text, page numbers, notes

Note: Title slides may use vertically centered positioning (y ≈ 3). All other slides must follow layout zones.

Theme Selection Guide

ContextRecommended ThemeWhy
Strategy / AI narrative / Investor deckNOVALarge titles, generous whitespace, authoritative feel
Technical deep dive / Architecture / DevORBITDark background, strong contrast, clean technical aesthetic
Metrics-heavy / Growth / Business performancePULSEBold KPI emphasis, high-contrast numbers, data-focused
Founder story / Brand / MinimalistMINIMAExtremely clean, typography-driven, minimal decoration

Default: Use NOVA if context is unclear or not specified.

Predefined Themes

All presentations MUST use one of these themes.

Each theme has TWO variants:

  • Cover (slide 0): Dark background, high visual impact, emotional
  • Content (slides 1+): Light background, clean, readable
ThemePositioningCover ColorsContent ColorsStyle
NOVA (Default)Strategy / AI / Investorbg: #0A0F1C, title: #FFFFFF, accent: #7C3AEDbg: #F6F7FB, primary: #0A0F1C, accent: #7C3AEDDark cover, light content
ORBITTechnical / Architecture / Devbg: #0B1220, title: #F1F5F9, accent: #22D3EEbg: #0F172A, primary: #F1F5F9, accent: #22D3EEDark cover, lighter dark content
PULSEMetrics / Growth / Performancebg: #111827, title: #FFFFFF, accent: #EF4444bg: #FFFFFF, primary: #111827, accent: #EF4444Dark cover, white content
MINIMAFounder / Brand / Minimalistbg: #111111, title: #FFFFFFbg: #FAFAFA, primary: #111111, accent: #000000Black cover, off-white content
Color Reference Table
PurposeNOVA CoverNOVA ContentORBIT CoverORBIT Content
Background#0A0F1C#F6F7FB#0B1220#0F172A
Title/Primary#FFFFFF#0A0F1C#F1F5F9#F1F5F9
Subtitle/Secondary#94A3B8#5B6475#94A3B8#94A3B8
Accent#7C3AED#7C3AED#22D3EE#22D3EE
Text-#0A0F1C-#F1F5F9
PurposePULSE CoverPULSE ContentMINIMA CoverMINIMA Content
Background#111827#FFFFFF#111111#FAFAFA
Title/Primary#FFFFFF#111827#FFFFFF#111111
Subtitle/Secondary#9CA3AF#6B7280#999999#777777
Accent#EF4444#EF4444#FFFFFF#000000
Success-#10B981--
Warning-#F59E0B--
Secondary#5B6475#94A3B8#6B7280#777777
Accent#7C3AED#22D3EE#EF4444#000000
Success-#34D399#10B981-
Warning--#F59E0B-
Highlight#22D3EE---
Theme Code Templates (Copy & Use)

IMPORTANT: Each theme has TWO variants - Cover (slide 0) and Content (slides 1+).

NOVA Theme (Strategy / AI / Investor):

javascript
const theme = {
// Cover slide (slide 0) - dark, high impact
cover: {
background: '#0A0F1C',
title: '#FFFFFF',
subtitle: '#94A3B8',
accent: '#7C3AED'
},
// Content slides (slides 1+) - light, readable
content: {
background: '#F6F7FB',
primary: '#0A0F1C',
secondary: '#5B6475',
accent: '#7C3AED',
text: '#0A0F1C'
}
};

ORBIT Theme (Technical / Architecture / Dev):

javascript
const theme = {
// Cover slide (slide 0) - dark, tech aesthetic
cover: {
background: '#0B1220',
title: '#F1F5F9',
subtitle: '#94A3B8',
accent: '#22D3EE'
},
// Content slides (slides 1+) - slightly lighter dark
content: {
background: '#0F172A',
primary: '#F1F5F9',
secondary: '#94A3B8',
accent: '#22D3EE',
success: '#34D399',
text: '#F1F5F9'
}
};

PULSE Theme (Metrics / Growth / Performance):

javascript
const theme = {
// Cover slide (slide 0) - dark, bold
cover: {
background: '#111827',
title: '#FFFFFF',
subtitle: '#9CA3AF',
accent: '#EF4444'
},
// Content slides (slides 1+) - light, clean
content: {
background: '#FFFFFF',
primary: '#111827',
secondary: '#6B7280',
accent: '#EF4444',
success: '#10B981',
warning: '#F59E0B',
text: '#111827'
}
};

MINIMA Theme (Founder / Brand / Minimalist):

javascript
const theme = {
// Cover slide (slide 0) - pure black & white
cover: {
background: '#111111',
title: '#FFFFFF',
subtitle: '#999999',
accent: '#FFFFFF'
},
// Content slides (slides 1+) - off-white, clean
content: {
background: '#FAFAFA',
primary: '#111111',
secondary: '#777777',
accent: '#000000',
text: '#111111'
}
};

Usage Example:

javascript
const pres = new PptxGenJS();

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 90 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

7-day trend score
0

Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/xorbitsai/xagent/presentation-generator/badge)](https://verified-skill.com/skills/xorbitsai/xagent/presentation-generator)

Something wrong with this skill or its page? Tell us.