You will generate one .pptx file by writing a JavaScript program that uses
pptxgenjs and runs it via the execute_javascript_code tool. Save the file
to the workspace (use the output dir the tool returns), then report the path
and a 1-line layout summary.
⚠️ Hard rules — NO exceptions
MATCH THE USER'S LANGUAGE. This is rule zero, the most violated rule.
If the user prompt is in Chinese (中文), EVERY string in the deck — kickers,
slide titles, body text, captions, kicker labels, folio prefixes, sample
names, captions — must be in Chinese. NEVER copy English template
phrases like THE PROBLEM, FEATURE STORY, RESEARCH BRIEF,
THE BOTTOM LINE, BUILT BY BUILDERS into a Chinese deck. Translate
them: e.g. THE PROBLEM → 问题所在, THE SOLUTION → 解决方案,
MARKET OPPORTUNITY → 市场机会, THE TEAM → 团队, USE OF FUNDS →
资金用途, THE BOTTOM LINE → 一句话总结, RESEARCH BRIEF →
研究简报, CASE STUDY → 案例研究. Person names in a Chinese deck
should be Chinese names (e.g. 张伟 · 陈琳), not transliterated English
names. Folio reads 01 / 12 in either language (digits are universal).
Same applies to other languages: match the prompt.
One palette only. Pick one of the 5 palettes below, use only its 4 hex
values. Never invent new hex.
Two fonts only. Display = Georgia (serif, present on all OSes).
Body = Calibri (sans, Office default). No custom fonts — .pptx
recipients won't have them and the deck will fall back to Times.
For Chinese decks: Georgia + Calibri both render Chinese via system
fallback fonts (PingFang on macOS, Microsoft YaHei on Windows) — that's
fine, do not switch to custom Chinese fonts.
2a. 🚫 NEVER apply charSpacing to CJK / non-Latin text. The trick of
"tracked-out caps" only works for Latin letters (A B C D). On Chinese,
Japanese, Korean characters — which are already full-square glyphs —
charSpacing: 10 (0.10em) renders as 部 署 周 期 with huge gaps
between every character. This looks broken on EVERY rendering platform.
Rule: if the text contains ANY CJK character, set charSpacing: 0
(or omit the property entirely). Only apply charSpacing: 8-15 when
the entire string is uppercase Latin (e.g. RESEARCH BRIEF, PART 02).
For Chinese kickers, just use bold + small caps look via 11pt bold ink-tint
text WITHOUT any character spacing.
Forbidden visual elements (PowerPoint defaults to these — you must
actively avoid):
Real content only. No lorem ipsum, no [Title here] placeholders,
no fabricated statistics. If a slot has no user data, drop the slot.
Team slides especially: if the user did not provide team names,
titles, or bios, DO NOT invent them. Don't make up 陈明远 · 前阿里 云智能平台总监 · 清华大学计算机硕士 — that's fabrication and looks
fake to anyone in the industry. Either ask the user for team info
OR drop the team slide entirely and note "团队信息待补充".
Same for fake financial metrics (MRR / ARR / growth rate), fake
customer names, fake competitive comparisons. If you don't have it,
don't ship it.
Slide count is driven by content. 6–12 short, 15–25 long. No padding.
Fill the slide. The 13.33 × 7.5 inch canvas is large. Do NOT cram
everything into the left third. Use align: 'center' on hero text, place
the body block across columns 1–11 (x: 0.7 to 12.6), use the full vertical
range top-to-bottom. A slide that looks 60%+ empty is broken.
Sizing for Chinese text: Chinese characters take MORE horizontal
space per char than Latin. Rules of thumb:
Hero title at fontSize 40-48: give the textbox at least w: 12 inches
(the full content width). Title at w: 6 will overflow / wrap badly.
1 Chinese character at 40pt ≈ 0.55 inch wide. Plan accordingly.
For section titles (24-28pt) keep w ≥ 8 inches.
For body text (14-16pt) w: 11+ is safe for full sentences.
No overlapping shapes. When you place a dark section header / banner
on a slide, leave at least 0.3 inch of vertical clearance before any
text shape. Banners at y: 1.2, h: 0.8 should not have a title block
starting at y: 1.5 — that overlaps and clips text.
🎨 Palettes — pick ONE
Each: ink (text + dark surfaces), paper (slide background), paper-tint
(card background / chart fill), ink-tint (kicker + dividers).
Monocle (default / business / tech)
ink 0A0A0B · paper F1EFEA · paper-tint E8E5DE · ink-tint 18181A
Slide title (display): Georgia, 48pt, ink color, bold: false
Body: Calibri, 16pt, ink, line spacing 1.4
Kicker (small uppercase label above title): Calibri, 10pt, ink-tint,
bold: true, charSpacing: 10
⚠️ pptxgenjs charSpacing units are hundredths of an em (relative to
font size), NOT 1/100 pt. CSS standard for "tracked-out caps" is
letter-spacing: 0.08em–0.12em → use charSpacing: 8 to 12.
charSpacing: 10 = 0.10em (DEFAULT for kicker — tight, readable)
The kicker is a STANDALONE section label, not a fragment of the title.
It's the magazine equivalent of a department tag (NYT-style).
✅ Correct kickers (short, 1–4 words, all caps, semantic label):
FEATURE STORY
THE NEXT PARADIGM
RESEARCH BRIEF
POINT 02
CASE STUDY
THE BOTTOM LINE
INDUSTRY ANALYSIS
❌ NEVER do this (splitting the title across kicker + display):
Kicker THE RISE OF REMOTE-FIRST + Title Engineering Teams — WRONG.
The title must read as one complete phrase.
✅ Correct version of above:
Kicker RESEARCH BRIEF (or THE FUTURE OF WORK)
Title The Rise of Remote-First Engineering Teams (complete, one block)
🔣 Punctuation rules
Meta rows and bylines: separate items with middle dot · (Unicode U+00B7),
NOT hyphen - or em-dash —.
Example: Remote Work Research · May 2026 (NOT Remote Work Research - May 2026)
Citations: — Author Name, Role · Source, Year (em-dash before name)
En-dash – for number ranges (2019–2024), hyphen - only inside compound
words (remote-first).
📐 10 layouts
Each slide should set background to paper (or ink for L02 inverted).
Standard slide is 13.33 × 7.5 inches (16:9).
ID
Name
Layout
L01
Hero Cover
Center: kicker (top 1.5") + display title (centered 3.5") + lead body (5.5") + meta row "Author · Date" (bottom 6.5")
L02
Act Divider
Background = ink, text = paper. Kicker + 60pt display title centered
L03
Big Numbers Grid
3 cards in row: each = paper-tint background (no shadow!), kicker top, 80pt big number, 14pt caption
L04
Quote + Visual
Left half (kicker + title + body + callout) · Right half (color block, paper-tint with single accent line)
L05
Image Grid
2×2 or 3×2 paper-tint blocks (same dims), kicker label above each
L06
Pipeline / Flow
3–5 numbered columns: large № (Georgia 40pt) + step title + 1-line desc
L07
Hero Question
One full-slide question, Georgia 54pt, centered, 1.3 line height
50/50 split. Left column 55% opacity (before). Right column 100% (after). Use kicker BEFORE / AFTER
L10
Closing
Like L01 but kicker = THE BOTTOM LINE. End with a takeaway sentence, no folio on this slide
🛠️ pptxgenjs implementation pattern
⚠️ Top-level await is FORBIDDEN. The JavaScript executor runtime runs the
script as node script.js with NO package.json in the exec dir, so
top-level await makes Node guess ESM mode and require() then throws
require is not defined in ES module scope. Wrap everything in an async
IIFE so the await lives inside a function:
const pptxgen = require('pptxgenjs');
(async () => {
const pres = new pptxgen();
pres.layout = 'LAYOUT_WIDE'; // 13.33 × 7.5
// Define palette ONCE at top, reference everywhere
const palette = { ink: '0A0A0B', paper: 'F1EFEA', paperTint: 'E8E5DE', inkTint: '18181A' };
const fonts = { display: 'Georgia', body: 'Calibri' };
// L01 Cover (centered hero — fills the slide)
// NOTE on language: if the user prompt is Chinese, kicker / title / meta MUST be Chinese.
// Examples below are English for illustration; substitute your language.
const s1 = pres.addSlide();
s1.background = { color: palette.paper };
// Kicker — small, centered, only ~10 chars tracked-out
s1.addText('RESEARCH BRIEF', {
x: 0.7, y: 2.4, w: 12, h: 0.4,
fontFace: fonts.body, fontSize: 11, color: palette.inkTint,
bold: true, charSpacing: 10, align: 'center',
});
// Display title — centered, wide enough to wrap on 2 lines if needed
s1.addText('Why AI Agents Will Change Software Development', {
x: 0.7, y: 2.9, w: 12, h: 1.8,
fontFace: fonts.display, fontSize: 48, color: palette.ink, align: 'center',
});
// Lead body (optional one-liner subtitle)
s1.addText('A 2026 research brief on agent infrastructure, market shape, and the shift to production-grade systems.', {
x: 1.5, y: 4.8, w: 10.3, h: 1.0,
fontFace: fonts.body, fontSize: 14, color: palette.ink, align: 'center',
});
// Meta row — bottom center
s1.addText('Xagent Team · May 2026', {
x: 0.7, y: 6.6, w: 12, h: 0.3,
fontFace: fonts.body, fontSize: 11, color: palette.inkTint, align: 'center',
});
// Folio bottom-right
s1.addText('01 / 06', { x: 11.5, y: 7.0, w: 1.5, h: 0.3,
fontFace: fonts.body, fontSize: 10, color: palette.inkTint, align: 'right' });
// Save — `await` is INSIDE the async IIFE, this is fine
await pres.writeFile({ fileName: 'editorial-deck.pptx' });
console.log('Done: editorial-deck.pptx');
})(); // ← critical: close + invoke the async IIFE
⚠️ About the layout numbers above: the cover places hero text in the
center of the slide, not the left edge. Common mistake from earlier
templates was x: 0.7, y: 1.8 with no align: 'center' — that pins title
to the upper-left and leaves ~60% of the slide empty. Don't repeat that.
⚠️ Don't forget the packages arg. When calling execute_javascript_code,
pass packages: "pptxgenjs" (string) so the executor npm installs it
before running. Without it the script crashes with Cannot find module 'pptxgenjs'.
pptxgenjs is not preinstalled in the sandbox — supplying it via
packages is what makes it available for the run. Always pass it
through packages, even on repeated runs in the same task.
📝 Output checklist (verify before running)
JS is wrapped in (async () => { ... })() IIFE — no top-level await
(Node will pick ESM mode and require() will throw).
packages: "pptxgenjs" is passed to execute_javascript_code so
the executor installs it before running.
LANGUAGE matches the user's prompt (Chinese prompt → Chinese deck;
NO English template phrases like THE PROBLEM leaking through). Check
every addText call before running.
Hero/cover text is centered (align: 'center') and uses the full
slide width (w: 12+), not pinned to x: 0.7 with no alignment.
Palette: exactly ONE chosen, all 4 hex values match
Fonts: ONLY Georgia + Calibri (no Playfair Display etc — those won't render in PPT)
No shadow:, no glow:, no gradient:, no rectRadius: > 0
charSpacing ≤ 15 for English uppercase kickers (units are 1/100 em).
For Chinese / CJK text: charSpacing: 0 ALWAYS (no exceptions).
Anything > 0 on CJK looks broken with huge gaps between every character.
Kicker is a SEPARATE section label (e.g. RESEARCH BRIEF for EN
decks, 研究简报 for ZH decks), NOT a fragment of the slide title.
Title is one complete phrase by itself.
Meta rows use middle dot · between items (not - or —)
Slide count 6–25 driven by user content
L01 cover on slide 1, L10 closing on last slide
Folio "NN / TT" on every slide except L10
All numbers / quotes from user content (or clearly attributed sources)
No fabricated team / customer / financial data. If user didn't
give team names, drop the team slide (or use "团队信息待补充").
Chinese hero titles use w: 12 (not w: 6). Chinese chars are
~0.55" each at 40pt — narrow textboxes overflow / wrap broken.
No overlapping shapes (banner blocks vs. title blocks). Allow at
least 0.3" vertical clearance between adjacent y-positioned shapes.
Final answer FIRST LINE is [filename](file:UUID) as bare markdown
(not in code fences, not as "file_id: UUID" text). Otherwise the
chip won't render — the user can't click anything.
Run via execute_javascript_code (with packages: "pptxgenjs"), then:
Read the tool's response. When the JS run succeeds and produces a
.pptx in the workspace, the tool result includes a markdown_link
field (e.g. when there's one output file) or a file_refs array
whose entries each carry file_id + filename + markdown_link.
Use the returned markdown_link string verbatim.
In your final answer, the first line MUST be that chip link
(literal markdown syntax, NOT wrapped in backticks, NOT presented as
"here's the UUID"):
That is, the message body literally starts with [filename](file:UUID)
on its own line — NOT inside ``` code fences. The exact UUID comes
from the tool response; never fabricate one.
❌ WRONG — common failure mode that renders as plain text:
This shows the UUID as decoration and the user can't click anything.
The chat UI looks for [name](file:UUID) markdown specifically.
❌ ALSO WRONG: putting the chip link inside a code block:
Code blocks suppress markdown — the link won't render as a chip.
❌ ALSO WRONG: calling get_file_info(...) to "fetch" the
file_id — its FileInfo return shape does not include file_id.
The chip reference is in the executor's own response, not a
separate metadata call.
1---2name: pptx-editorial3description: A native .pptx deck with magazine-grade editorial styling: "pitch deck", "投资人路演 PPT", "美观 PPT", board review, product launch. Named palettes, fixed typography, 10 numbered layouts.4---56# Editorial PPTX Deck78You will generate one `.pptx` file by writing a JavaScript program that uses9**pptxgenjs** and runs it via the `execute_javascript_code` tool. Save the file10to the workspace (use the output dir the tool returns), then report the path11and a 1-line layout summary.1213## ⚠️ Hard rules — NO exceptions14150. **MATCH THE USER'S LANGUAGE.** This is rule zero, the most violated rule.16 If the user prompt is in Chinese (中文), EVERY string in the deck — kickers,17 slide titles, body text, captions, kicker labels, folio prefixes, sample18 names, captions — must be in Chinese. **NEVER** copy English template19 phrases like `THE PROBLEM`, `FEATURE STORY`, `RESEARCH BRIEF`,20 `THE BOTTOM LINE`, `BUILT BY BUILDERS` into a Chinese deck. Translate21 them: e.g. `THE PROBLEM` → `问题所在`, `THE SOLUTION` → `解决方案`,22 `MARKET OPPORTUNITY` → `市场机会`, `THE TEAM` → `团队`, `USE OF FUNDS` →23 `资金用途`, `THE BOTTOM LINE` → `一句话总结`, `RESEARCH BRIEF` →24 `研究简报`, `CASE STUDY` → `案例研究`. Person names in a Chinese deck25 should be Chinese names (e.g. 张伟 · 陈琳), not transliterated English26 names. Folio reads `01 / 12` in either language (digits are universal).27 Same applies to other languages: match the prompt.281. **One palette only.** Pick one of the 5 palettes below, use only its 4 hex29 values. Never invent new hex.302. **Two fonts only.** Display = `Georgia` (serif, present on all OSes).31 Body = `Calibri` (sans, Office default). No custom fonts — `.pptx`32 recipients won't have them and the deck will fall back to Times.33 **For Chinese decks**: Georgia + Calibri both render Chinese via system34 fallback fonts (PingFang on macOS, Microsoft YaHei on Windows) — that's35 fine, do not switch to custom Chinese fonts.362a. **🚫 NEVER apply `charSpacing` to CJK / non-Latin text.** The trick of37 "tracked-out caps" only works for Latin letters (`A B C D`). On Chinese,38 Japanese, Korean characters — which are already full-square glyphs —39 `charSpacing: 10` (0.10em) renders as `部 署 周 期` with huge gaps40 between every character. This looks broken on EVERY rendering platform.41 Rule: if the text contains ANY CJK character, set `charSpacing: 0`42 (or omit the property entirely). Only apply `charSpacing: 8-15` when43 the entire string is uppercase Latin (e.g. `RESEARCH BRIEF`, `PART 02`).44 For Chinese kickers, just use bold + small caps look via 11pt bold ink-tint45 text WITHOUT any character spacing.463. **Forbidden visual elements** (PowerPoint defaults to these — you must47 actively avoid):48 - drop shadow / glow / reflection / soft edge / bevel / 3-D rotation49 - gradient backgrounds50 - rounded rectangles (use `rectRadius: 0`)51 - clipart, emoji as decoration, stock-photo placeholders52 - Comic Sans, Times New Roman default, Arial Black53 - smart-art with default styling54 - rainbow chart palettes (chart uses ink + paper-tint only)554. **Real content only.** No lorem ipsum, no `[Title here]` placeholders,56 no fabricated statistics. If a slot has no user data, drop the slot.57 - **Team slides especially**: if the user did not provide team names,58 titles, or bios, DO NOT invent them. Don't make up `陈明远 · 前阿里59 云智能平台总监 · 清华大学计算机硕士` — that's fabrication and looks60 fake to anyone in the industry. Either ask the user for team info61 OR drop the team slide entirely and note "团队信息待补充".62 - Same for fake financial metrics (MRR / ARR / growth rate), fake63 customer names, fake competitive comparisons. If you don't have it,64 don't ship it.655. **Slide count is driven by content.** 6–12 short, 15–25 long. No padding.666. **Fill the slide.** The 13.33 × 7.5 inch canvas is large. Do NOT cram67 everything into the left third. Use `align: 'center'` on hero text, place68 the body block across columns 1–11 (x: 0.7 to 12.6), use the full vertical69 range top-to-bottom. A slide that looks 60%+ empty is broken.707. **Sizing for Chinese text**: Chinese characters take MORE horizontal71 space per char than Latin. Rules of thumb:72 - Hero title at fontSize 40-48: give the textbox at least `w: 12` inches73 (the full content width). Title at `w: 6` will overflow / wrap badly.74 - 1 Chinese character at 40pt ≈ 0.55 inch wide. Plan accordingly.75 - For section titles (24-28pt) keep `w` ≥ 8 inches.76 - For body text (14-16pt) `w: 11+` is safe for full sentences.778. **No overlapping shapes.** When you place a dark section header / banner78 on a slide, leave at least 0.3 inch of vertical clearance before any79 text shape. Banners at `y: 1.2, h: 0.8` should not have a title block80 starting at `y: 1.5` — that overlaps and clips text.8182## 🎨 Palettes — pick ONE8384Each: `ink` (text + dark surfaces), `paper` (slide background), `paper-tint`85(card background / chart fill), `ink-tint` (kicker + dividers).8687- **Monocle** (default / business / tech)88 ink `0A0A0B` · paper `F1EFEA` · paper-tint `E8E5DE` · ink-tint `18181A`89- **Indigo Porcelain** (data / research)90 ink `0A1F3D` · paper `F1F3F5` · paper-tint `E4E8EC` · ink-tint `152A4A`91- **Forest Ink** (sustainability / culture)92 ink `1A2E1F` · paper `F5F1E8` · paper-tint `ECE7DA` · ink-tint `253D2C`93- **Kraft Paper** (humanities / literature)94 ink `2A1E13` · paper `EEDFC7` · paper-tint `E0D0B6` · ink-tint `3A2A1D`95- **Dune** (art / design / fashion)96 ink `1F1A14` · paper `F0E6D2` · paper-tint `E3D7BF` · ink-tint `2D2620`9798(pptxgenjs takes hex without the `#` prefix.)99100## ✒️ Typography rules (use exactly these sizes)101102- **Slide title (display)**: Georgia, 48pt, `ink` color, `bold: false`103- **Body**: Calibri, 16pt, `ink`, line spacing 1.4104- **Kicker** (small uppercase label above title): Calibri, 10pt, `ink-tint`,105 `bold: true`, **`charSpacing: 10`**106 ⚠️ pptxgenjs `charSpacing` units are **hundredths of an em** (relative to107 font size), NOT 1/100 pt. CSS standard for "tracked-out caps" is108 `letter-spacing: 0.08em–0.12em` → use **`charSpacing: 8` to `12`**.109 - `charSpacing: 10` = 0.10em (DEFAULT for kicker — tight, readable)110 - `charSpacing: 15` = 0.15em (max for kicker)111 - `charSpacing: 30` = 0.30em (already visibly too wide — letters drift apart)112 - `charSpacing: 50` = 0.5em = very airy, **don't use anywhere**113 - `charSpacing: 100` = 1em = one full character gap (DON'T USE)114 - `charSpacing: 200`+ = letters split into separate columns (DESTROYED)115 - **HARD CAP: never use `charSpacing > 15`.** No exceptions for any text116 element — bigger values always look broken in PPT.117- **Folio** (`01 / 12` bottom-right): Calibri, 10pt, `ink-tint`118- **Big number** (L03): Georgia, 80pt, `ink`119- **Big quote** (L08): Georgia italic, 36pt, `ink`120121## 🏷️ Kicker semantics — READ CAREFULLY122123The **kicker is a STANDALONE section label**, not a fragment of the title.124It's the magazine equivalent of a department tag (NYT-style).125126✅ **Correct kickers** (short, 1–4 words, all caps, semantic label):127- `FEATURE STORY`128- `THE NEXT PARADIGM`129- `RESEARCH BRIEF`130- `POINT 02`131- `CASE STUDY`132- `THE BOTTOM LINE`133- `INDUSTRY ANALYSIS`134135❌ **NEVER do this** (splitting the title across kicker + display):136- Kicker `THE RISE OF REMOTE-FIRST` + Title `Engineering Teams` — WRONG.137 The title must read as one complete phrase.138139✅ **Correct version of above**:140- Kicker `RESEARCH BRIEF` (or `THE FUTURE OF WORK`)141- Title `The Rise of Remote-First Engineering Teams` (complete, one block)142143## 🔣 Punctuation rules144145- Meta rows and bylines: separate items with **middle dot `·`** (Unicode U+00B7),146 NOT hyphen `-` or em-dash `—`.147 Example: `Remote Work Research · May 2026` (NOT `Remote Work Research - May 2026`)148- Citations: `— Author Name, Role · Source, Year` (em-dash before name)149- En-dash `–` for number ranges (`2019–2024`), hyphen `-` only inside compound150 words (`remote-first`).151152## 📐 10 layouts153154Each slide should set background to `paper` (or `ink` for L02 inverted).155Standard slide is 13.33 × 7.5 inches (16:9).156157| ID | Name | Layout |158|---|---|---|159| L01 | Hero Cover | Center: kicker (top 1.5") + display title (centered 3.5") + lead body (5.5") + meta row "Author · Date" (bottom 6.5") |160| L02 | Act Divider | Background = `ink`, text = `paper`. Kicker + 60pt display title centered |161| L03 | Big Numbers Grid | 3 cards in row: each = paper-tint background (no shadow!), kicker top, 80pt big number, 14pt caption |162| L04 | Quote + Visual | Left half (kicker + title + body + callout) · Right half (color block, paper-tint with single accent line) |163| L05 | Image Grid | 2×2 or 3×2 paper-tint blocks (same dims), kicker label above each |164| L06 | Pipeline / Flow | 3–5 numbered columns: large № (Georgia 40pt) + step title + 1-line desc |165| L07 | Hero Question | One full-slide question, Georgia 54pt, centered, 1.3 line height |166| L08 | Big Quote | 36pt Georgia italic quote (5 lines max), 14pt attribution below "— Name, Role · Source, Year" |167| L09 | Before / After | 50/50 split. Left column 55% opacity (before). Right column 100% (after). Use kicker `BEFORE` / `AFTER` |168| L10 | Closing | Like L01 but kicker = `THE BOTTOM LINE`. End with a takeaway sentence, no folio on this slide |169170## 🛠️ pptxgenjs implementation pattern171172⚠️ **Top-level `await` is FORBIDDEN.** The JavaScript executor runtime runs the173script as `node script.js` with NO `package.json` in the exec dir, so174top-level `await` makes Node guess ESM mode and `require()` then throws175`require is not defined in ES module scope`. **Wrap everything in an async176IIFE** so the await lives inside a function:177178```javascript179const pptxgen = require('pptxgenjs');180181(async () => {182 const pres = new pptxgen();183 pres.layout = 'LAYOUT_WIDE'; // 13.33 × 7.5184185// Define palette ONCE at top, reference everywhere186const palette = { ink: '0A0A0B', paper: 'F1EFEA', paperTint: 'E8E5DE', inkTint: '18181A' };187const fonts = { display: 'Georgia', body: 'Calibri' };188189// L01 Cover (centered hero — fills the slide)190// NOTE on language: if the user prompt is Chinese, kicker / title / meta MUST be Chinese.191// Examples below are English for illustration; substitute your language.192const s1 = pres.addSlide();193s1.background = { color: palette.paper };194// Kicker — small, centered, only ~10 chars tracked-out195s1.addText('RESEARCH BRIEF', {196 x: 0.7, y: 2.4, w: 12, h: 0.4,197 fontFace: fonts.body, fontSize: 11, color: palette.inkTint,198 bold: true, charSpacing: 10, align: 'center',199});200// Display title — centered, wide enough to wrap on 2 lines if needed201s1.addText('Why AI Agents Will Change Software Development', {202 x: 0.7, y: 2.9, w: 12, h: 1.8,203 fontFace: fonts.display, fontSize: 48, color: palette.ink, align: 'center',204});205// Lead body (optional one-liner subtitle)206s1.addText('A 2026 research brief on agent infrastructure, market shape, and the shift to production-grade systems.', {207 x: 1.5, y: 4.8, w: 10.3, h: 1.0,208 fontFace: fonts.body, fontSize: 14, color: palette.ink, align: 'center',209});210// Meta row — bottom center211s1.addText('Xagent Team · May 2026', {212 x: 0.7, y: 6.6, w: 12, h: 0.3,213 fontFace: fonts.body, fontSize: 11, color: palette.inkTint, align: 'center',214});215// Folio bottom-right216s1.addText('01 / 06', { x: 11.5, y: 7.0, w: 1.5, h: 0.3,217 fontFace: fonts.body, fontSize: 10, color: palette.inkTint, align: 'right' });218219 // Save — `await` is INSIDE the async IIFE, this is fine220 await pres.writeFile({ fileName: 'editorial-deck.pptx' });221 console.log('Done: editorial-deck.pptx');222})(); // ← critical: close + invoke the async IIFE223```224225⚠️ **About the layout numbers above**: the cover places hero text in the226*center* of the slide, not the left edge. Common mistake from earlier227templates was `x: 0.7, y: 1.8` with no `align: 'center'` — that pins title228to the upper-left and leaves ~60% of the slide empty. Don't repeat that.229230⚠️ **Don't forget the `packages` arg.** When calling `execute_javascript_code`,231pass `packages: "pptxgenjs"` (string) so the executor `npm install`s it232before running. Without it the script crashes with `Cannot find module233'pptxgenjs'`.234235pptxgenjs is **not** preinstalled in the sandbox — supplying it via236`packages` is what makes it available for the run. Always pass it237through `packages`, even on repeated runs in the same task.238239## 📝 Output checklist (verify before running)240241- [ ] **JS is wrapped in `(async () => { ... })()` IIFE** — no top-level `await`242 (Node will pick ESM mode and `require()` will throw).243- [ ] **`packages: "pptxgenjs"` is passed to `execute_javascript_code`** so244 the executor installs it before running.245- [ ] **LANGUAGE matches the user's prompt** (Chinese prompt → Chinese deck;246 NO English template phrases like `THE PROBLEM` leaking through). Check247 every `addText` call before running.248- [ ] **Hero/cover text is centered (`align: 'center'`) and uses the full249 slide width** (`w: 12+`), not pinned to `x: 0.7` with no alignment.250- [ ] Palette: exactly ONE chosen, all 4 hex values match251- [ ] Fonts: ONLY Georgia + Calibri (no Playfair Display etc — those won't render in PPT)252- [ ] No `shadow:`, no `glow:`, no `gradient:`, no `rectRadius:` > 0253- [ ] **`charSpacing` ≤ 15** for English uppercase kickers (units are 1/100 em).254 For **Chinese / CJK** text: `charSpacing: 0` ALWAYS (no exceptions).255 Anything > 0 on CJK looks broken with huge gaps between every character.256- [ ] **Kicker is a SEPARATE section label** (e.g. `RESEARCH BRIEF` for EN257 decks, `研究简报` for ZH decks), NOT a fragment of the slide title.258 Title is one complete phrase by itself.259- [ ] Meta rows use middle dot `·` between items (not `-` or `—`)260- [ ] Slide count 6–25 driven by user content261- [ ] L01 cover on slide 1, L10 closing on last slide262- [ ] Folio "NN / TT" on every slide except L10263- [ ] All numbers / quotes from user content (or clearly attributed sources)264- [ ] **No fabricated team / customer / financial data**. If user didn't265 give team names, drop the team slide (or use "团队信息待补充").266- [ ] **Chinese hero titles use `w: 12`** (not `w: 6`). Chinese chars are267 ~0.55" each at 40pt — narrow textboxes overflow / wrap broken.268- [ ] **No overlapping shapes** (banner blocks vs. title blocks). Allow at269 least 0.3" vertical clearance between adjacent y-positioned shapes.270- [ ] **Final answer FIRST LINE is `[filename](file:UUID)`** as bare markdown271 (not in code fences, not as "file_id: UUID" text). Otherwise the272 chip won't render — the user can't click anything.273274Run via `execute_javascript_code` (with `packages: "pptxgenjs"`), then:2752761. **Read the tool's response.** When the JS run succeeds and produces a277 .pptx in the workspace, the tool result includes a `markdown_link`278 field (e.g. when there's one output file) or a `file_refs` array279 whose entries each carry `file_id` + `filename` + `markdown_link`.280 Use the returned `markdown_link` string verbatim.2812. In your final answer, **the first line MUST be that chip link**282 (literal markdown syntax, NOT wrapped in backticks, NOT presented as283 "here's the UUID"):284285 ✅ **CORRECT** (renders as clickable chip):286 ```287 [editorial-deck.pptx](file:20fae785-3823-4906-b385-d0e8a7807dc8)288 ```289 That is, the message body literally starts with `[filename](file:UUID)`290 on its own line — NOT inside ``` code fences. The exact UUID comes291 from the tool response; never fabricate one.292293 ❌ **WRONG — common failure mode that renders as plain text**:294 ```295 已获取文件信息:296 - 文件名: `editorial-deck.pptx`297 - file_id: `20fae785-3823-4906-b385-d0e8a7807dc8`298 ```299 This shows the UUID as decoration and the user can't click anything.300 The chat UI looks for `[name](file:UUID)` markdown specifically.301302 ❌ **ALSO WRONG**: putting the chip link inside a code block:303 <pre>304 ```305 [editorial-deck.pptx](file:20fae785-...)306 ```307 </pre>308 Code blocks suppress markdown — the link won't render as a chip.309310 ❌ **ALSO WRONG**: calling `get_file_info(...)` to "fetch" the311 file_id — its `FileInfo` return shape does not include `file_id`.312 The chip reference is in the executor's own response, not a313 separate metadata call.3143153. After the chip link line, report:316 - Palette chosen317 - Layout sequence (e.g. `L01 cover → L03 stats → L06 pipeline → L08 quote → L10 closing`)318 - Page count and file size
Run npx skillmds@latest add xorbitsai/pptx-editorial in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
A native .pptx deck with magazine-grade editorial styling: "pitch deck", "投资人路演 PPT", "美观 PPT", board review, product launch. Named palettes, fixed typography, 10 numbered layouts. It is listed under Design & Media on SkillMD.
This skill has not completed SkillMD's automated safety review yet. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
xorbitsai (@xorbitsai) published this skill. Their other Agent Skills are listed on their SkillMD profile.