一键导入
pptx
PowerPoint PPTX create, read, edit, review. Triggers: PowerPoint, PPTX, presentation, slides, deck.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
PowerPoint PPTX create, read, edit, review. Triggers: PowerPoint, PPTX, presentation, slides, deck.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
MUST USE for cli-jaw PABCD orchestration workflows — orchestrate, phase, attest/attestation, interview mode, goal mode, checkpoints, and multi-phase development. Triggers: orchestrate, phase, attest, attestation, interview, goal mode, checkpoint, PABCD, 요구사항 정리, 인터뷰, 스펙 정리. Operate state transitions only when the user explicitly requests orchestration or an active PABCD phase is injected — do not transition state merely because a document mentions phases, goals, or checkpoints.
MUST USE for every coding task — classifies work depth (C0-C5), task_tags overlays, modular limits, pre-write search, verification-before-completion, and safety rules. Triggers: develop, implement, refactor, feature, bug fix, test, review, code quality, scaffolding.
Use only on the Codex CLI for native image generation or image editing without an API key. Save final PNG files under ~/.cli-jaw/uploads, report web-ready absolute-path markdown, and send to Telegram or Discord only when explicitly requested.
MUST USE for any real runtime debugging in any language — crashes, silent failures, wrong output, build/test failures, flaky tests, performance regressions, and integration bugs. A 5-phase root-cause method: architecture check → investigate → analyze → hypothesize → implement. Triggers: debug this, why is X failing, flaky test, fix the crash, root cause, error, stack trace, regression, 왜 안 돼, 디버깅, 원인 분석.
MUST USE for code review and review-readiness — review process, quality thresholds, antipattern detection, review verdicts, and giving/receiving feedback. Triggers: review this, code review, PR review, check my diff, before merge, antipattern, review-readiness, 리뷰, 코드 리뷰, 머지 전에 확인.
MUST USE for any frontend, web UI, or visual implementation work — building, styling, or redesigning pages/components, responsive layouts, motion, component architecture, and production-surface polish. Triggers: frontend, UI, component, CSS, responsive, animation, React, Vue, Svelte, Tailwind, layout, styling, redesign, mockup, anti-slop, 프론트엔드, UI 작업, 반응형, 디자인 수정.
| name | pptx |
| description | PowerPoint PPTX create, read, edit, review. Triggers: PowerPoint, PPTX, presentation, slides, deck. |
Use this skill for PowerPoint .pptx creation, editing, review, and QA.
Triggers: "PowerPoint", "PPTX", "presentation", "slides", "deck".
OfficeCLI routing and consent rule:
officecli is available with command -v officecli.https://github.com/lidge-jun/OfficeCLI via bash "$(npm root -g)/cli-jaw/scripts/install-officecli.sh".iOfficeAI/OfficeCLI only when the user explicitly asks for upstream behavior.OfficeCLI is the recommended advanced backend for slide add/set/remove, validate, and query workflows.
Lightweight fallback: pptxgenjs for large programmatic generation (50+ data-driven slides) and Python scripts (scripts/*.py) for unpack/repair/thumbnail/cleanup when OfficeCLI is unavailable or the user chooses lightweight mode. See §3.
Do NOT use this skill for Keynote, Google Slides API automation, or image generation.
OfficeCLI discovery rule: use the installed CLI as the source of truth. Run officecli --help for workflows and officecli help pptx ... --json before inventing element/property names.
Same-file execution rule: run OfficeCLI commands against the same .pptx sequentially. Do not run officecli view, officecli validate, officecli query, or officecli get in parallel against one package. If a file lock occurs, stop and report the exact command and path before making a copy or retrying.
| Task | Action |
|---|---|
| Format like existing deck | cp source.pptx target.pptx && officecli open target.pptx — inherit theme/layouts/masters. See §2. |
| Read / analyze content | view and get commands (see Core Workflows) |
| Edit existing presentation | Read editing.md |
| Create from scratch | Read creating.md |
| Pitch deck (Seed / Series) | Read officecli-pitch-deck/SKILL.md |
| Morph transition animations | Read morph-ppt/SKILL.md |
| 3D morph effects with models | Read morph-ppt-3d/SKILL.md |
| JS programmatic fallback | Read pptxgenjs.md |
| Color palette / typography | Read references/design-system.md — 20 palettes, 8 font pairings |
| Thumbnail grid / visual QA | python3 scripts/thumbnail.py deck.pptx grid.png |
| Unpack / repair | python3 scripts/pptx_cli.py {open|save|validate|repair} |
Execution model: Run commands one at a time. Check exit code before proceeding. Non-zero = stop and fix.
When the user says "format like X.pptx", "match existing deck style", "based on template", or provides a source file — start from the source. Don't rebuild from scratch.
cp source.pptx target.pptx — inherits theme, slide masters, layouts, fonts, colorsofficecli open target.pptx — daemon returns immediately (do NOT run as run_in_background)/slideMaster, /slideLayout, /theme--prop layout=Title+Content) — they auto-inherit themeSlide master and theme definitions (fonts, colors, placeholder geometry) are document-specific. Recreating them from scratch:
tests/fixtures/*.pptx — pre-built examples shipped with this skillofficecli-pitch-deck/ templates — if pitch/investor contextmorph-ppt/reference/styles/* — 51 curated style definitions (bw--brutalist, dark--aurora-softedge, light--minimal-product, etc.)officecli create blank — only when nothing else applies# CORRECT: inherit theme and layouts
cp CompanyBrand.pptx Q4Report.pptx
officecli open Q4Report.pptx
officecli remove Q4Report.pptx "/slide[1]" # remove sample slides
officecli add Q4Report.pptx / --type slide --prop layout=Title
officecli add Q4Report.pptx '/slide[1]' --type textbox --prop text="Q4 Report" --prop placeholder=title
officecli close Q4Report.pptx
# WRONG: recreate theme (loses brand)
officecli create Q4Report.pptx
# ... add all fonts, colors, masters from scratch ...
officecli covers most PPTX tasks. For design, QA, and repair, use these references + scripts.
references/)| File | Read when | Contains |
|---|---|---|
references/design-system.md | Before picking colors/fonts — palette + typography decision | 20 palettes (business/nature/energy/tech/warm), 8 font pairings, 4 Korean fonts |
These are specific reference files nested inside subskill folders. Load only the one you need. §4 lists the top-level subskill SKILL.md entry points.
| Path | Read when | Contains |
|---|---|---|
morph-ppt/reference/decision-rules.md | Planning framework for content-heavy decks | Pyramid Principle, SCQA, page types |
morph-ppt/reference/pptx-design.md | Canvas spec, ghost position math | Canvas, fonts, spacing tokens (x=36cm ghost) |
morph-ppt/reference/styles/INDEX.md | Picking a distinct visual style | 51 style definitions with spec + example |
morph-ppt/reference/quality-gates.md | Phase 4–5 QA gates for morph decks | QA checklist |
morph-ppt/reference/officecli-pptx-min.md | Morph-specific officecli commands | Minimal command reference |
pptxgenjs.md | Programmatic generation (50+ data-driven slides) | PptxGenJS API reference |
recipes.md | 3 copy-paste repair patterns | Section divider z-order, KPI overflow, timeline spacing |
scripts/) — Python OOXML Toolkit| Script | Run when | Command |
|---|---|---|
scripts/pptx_cli.py | Unified Python CLI — unpack, save, validate, repair, thumbnail, search, TOC, add-slide, clean, export-pdf | python3 scripts/pptx_cli.py {open|save|validate|repair|text|search|toc|thumbnail|export-pdf|add-slide|clean} |
scripts/thumbnail.py | Slide thumbnail grid or individual PNGs (visual QA) | python3 scripts/thumbnail.py IN.pptx grid.png or IN.pptx out_dir/ --individual |
scripts/clean.py | Find/remove orphaned media/files from unpacked PPTX | python3 scripts/clean.py work/ [--delete] |
scripts/add_slide.py | Add or duplicate slides on unpacked dir (legacy OOXML) | python3 scripts/add_slide.py work/ --blank or --duplicate 3 --position 1 |
scripts/run_tests.py | Run skill regression tests (fixtures + expected outputs) | python3 scripts/run_tests.py |
When officecli can't do the job, escalate in this order:
| Level | When | Tool |
|---|---|---|
| L1 officecli high-level | Typical slide/shape add/set/remove | officecli add/set/remove/query/view |
L2 officecli raw-set | XML injection — custom animations, chart XML, theme tweaks | officecli raw-set FILE PATH --xpath X --action A --xml ... |
| L3 Python script | Thumbnail generation, orphan cleanup, unified CLI ops | python3 scripts/*.py |
| L4 Unpack → edit XML → repack | Morph transitions beyond officecli, custom p:transition XML, macro handling | scripts/pptx_cli.py open → edit work/ppt/slides/*.xml → save |
| L5 pptxgenjs | 50+ slides from datasets, composable factories, heavy loop logic | npm install pptxgenjs + JS pipeline |
Escalation signals:
pptx_cli.py clean)references/design-system.md + morph-ppt/reference/styles/INDEX.md FIRSTLoad ONLY the one subskill matching your task. Do not load all of them.
| Task | Subskill | Path |
|---|---|---|
| General PPTX | This file + recipes | creating.md / editing.md |
| Pitch deck | officecli-pitch-deck | ./officecli-pitch-deck/SKILL.md |
| Morph animations | morph-ppt | ./morph-ppt/SKILL.md |
| 3D morph | morph-ppt-3d | ./morph-ppt-3d/SKILL.md |
| JS fallback | pptxgenjs | ./pptxgenjs.md |
Design is a deliverable, not optional polish. A slide deck is not a document: if the largest element plus one glance does not communicate the slide's point, the hierarchy has failed.
The 3-second test. Every slide must pass it — a viewer grasps the one point in 3 seconds. Wrong chart type, bullet walls, and weak hierarchy all fail it.
Canonical owners (read for depth; this skill carries the slide-adapted essentials inline):
- Design-direction / intent discovery, hierarchy levers →
dev-uiux-designskill.- Anti-slop philosophy + render verification →
dev-frontendskill.
Before styling, state: deck type, audience, the decision the audience must make, existing brand/template, and the dominant visual reference. If a DESIGN.md or template exists, it overrides.
Reference files:
- Full palettes + Text/Muted columns + personality map:
references/design-system.md.- Slide-adapted hierarchy levers + per-slide checklist:
references/visual-hierarchy.md.- Copy-paste visual-effect recipes (gradient/shadow/glow/etc.):
references/visual-effects.md.- Distinct design styles:
morph-ppt/reference/styles/INDEX.md(51 curated styles).
When deck direction is vague ("멋지게 만들어줘", "깔끔하게"), ask up to 4 binary/ternary questions before building. If the user names a reference product, skip to mapping via references/design-system.md. (Adapted from dev-uiux-design §1; "viewport" step dropped — slides are fixed 16:9.)
executive/trustworthy · premium/editorial · energetic/product-launch · technical/precise · training/clear 중?"keynote sparse(한 메시지) · business normal(제목+시각+짧은 근거) · review dense(차트/표 중심) 중?"sharp grid(정밀/컨설팅) · soft cards(친근/제품) · editorial bleed(이미지/큰 타이포) · diagrammatic(프로세스/시스템) 중?"existing template/brand deck · product ref (Linear/Apple/Stripe) · industry convention · no reference — propose one 중?"Answers feed the dials below with reasoned values instead of defaults.
Before creating, decide these three parameters. Present to user if ambiguous.
| Dial | Range | Default | Meaning |
|---|---|---|---|
| DESIGN_VARIANCE | 1-10 | 4 | 1 = symmetric grid, 10 = asymmetric art-directed |
| VISUAL_DENSITY | 1-10 | 5 | 1 = gallery whitespace, 10 = dashboard dense |
| MOTION_INTENSITY | 1-10 | 3 | 1 = static cuts, 10 = cinematic morph |
Presets by deck type:
| Deck type | VARIANCE | DENSITY | MOTION |
|---|---|---|---|
| Investor pitch | 6 | 3 | 4 |
| Internal review | 3 | 7 | 1 |
| Conference keynote | 8 | 2 | 7 |
| Workshop / training | 4 | 6 | 2 |
| Product launch | 7 | 4 | 6 |
"복잡" = higher DENSITY, not higher VARIANCE. A complex brief means more data/features, not more visual tricks. "Simple" = decrease all three dials proportionally. (from
dev-uiux-design§2)
Standard widescreen is 33.87 × 19.05cm. Treat it as a 12-column grid internally.
usable = 33.87 − 2·margin − (N−1)·gap, then col_width = usable / N. Don't hand-pick x.Exactly one primary focal point per slide. Build the eye-path from 6 levers (full detail: references/visual-hierarchy.md):
Choose colors that match your topic — don't default to generic blue.
| Theme | Primary | Secondary | Accent | Text | Muted |
|---|---|---|---|---|---|
| Midnight Executive | 1E2761 | CADCFC | FFFFFF | 333333 | 8899BB |
| Slate Professional | 2C3E50 | ECF0F1 | E74C3C | 333333 | 7A8A94 |
| Forest & Moss | 2C5F2D | 97BC62 | F5F5F5 | 2D2D2D | 6B8E6B |
| Coral Energy | F96167 | F9E795 | 2F3C7E | 333333 | 8B7E6A |
| Warm Terracotta | B85042 | E7E8D1 | A7BEAE | 3D2B2B | 8C7B75 |
| Ocean Gradient | 065A82 | 1C7293 | 21295C | 2B3A4E | 6B8FAA |
| Charcoal Minimal | 36454F | F2F2F2 | 212121 | 333333 | 7A8A94 |
| Berry & Cream | 6D2E46 | A26769 | ECE2D0 | 3D2233 | 8C6B7A |
Use Text for body copy on light backgrounds, Muted for captions, labels, and axis text.
On dark backgrounds (brightness < 30%), all body text must be white (FFFFFF) or near-white — mid-gray fails in projection.
Off-black: 0A0A0A not 000000.
Avoid: purple gradient on white (AI slop), rainbow multi-accent, FFFFFF bg + 000000 text (zero personality).
references/design-system.md.Every slide needs a visual element — shape, chart, table, or picture. Text-only slides are forgettable.
Layout options (vary these — don't repeat the same one):
Assets to use actively:
# Shapes as content containers (cards, banners, blocks)
officecli add deck.pptx '/slide[1]' --type shape --prop geometry=roundRect \
--prop fill=1E2761 --prop x=1cm --prop y=4cm --prop w=15cm --prop h=12cm
# Tables for structured data
officecli add deck.pptx '/slide[2]' --type table \
--prop rows=4 --prop cols=3 --prop x=1cm --prop y=3cm --prop width=24cm --prop height=6cm
# Charts for data visualization
officecli add deck.pptx '/slide[3]' --type chart \
--prop chartType=column --prop title='Revenue' --prop 'data=Q1:12,Q2:15,Q3:18,Q4:20'
# Pictures with alt text
officecli add deck.pptx '/slide[1]' --type picture \
--prop path=photo.png --prop x=14cm --prop y=3cm --prop width=8cm --prop height=5cm \
--prop alt='Team photo'
# Hyperlinks on shapes
officecli set deck.pptx '/slide[1]/shape[2]' --prop link='https://example.com'
# Video / audio embedding
officecli add deck.pptx '/slide[4]' --type video --prop path=demo.mp4 \
--prop x=2cm --prop y=3cm --prop width=20cm --prop height=12cm --prop autoplay=true
# OLE embed (Excel, Word, PDF inside a slide)
officecli add deck.pptx '/slide[5]' --type ole --prop path=data.xlsx \
--prop x=2cm --prop y=3cm --prop width=20cm --prop height=12cm
# Connectors / arrows between shapes.
# Endpoints use from=/to= (shape index or /slide[N]/shape[M]). startShape/endShape are READ-ONLY.
# Every flow connector needs an arrowhead. shape=elbow is the canonical right-angle form.
officecli add deck.pptx '/slide[2]' --type connector \
--prop from=1 --prop to=2 --prop shape=elbow --prop color=#4472C4 --prop tailEnd=arrow
# Speaker notes on every content slide
officecli add deck.pptx '/slide[1]' --type notes --prop 'text=Key talking point here.'
# Theme colors (use instead of hex for theme-aware decks)
officecli set deck.pptx '/slide[1]/shape[1]' --prop fill=accent1
# Available: accent1..accent6, dk1, dk2, lt1, lt2, tx1, tx2, bg1, bg2
# Flip / rotate shapes
officecli set deck.pptx '/slide[1]/shape[2]' --prop flipH=true
officecli set deck.pptx '/slide[1]/shape[2]' --prop rotation=45
# Slide master / layout editing (theme customization)
officecli set deck.pptx '/slideMaster[1]/shape[2]' --prop text='Company Name'
officecli set deck.pptx '/slideLayout[2]/shape[1]' --prop fill=1E2761
# Animations (entrance, exit, emphasis)
officecli set deck.pptx '/slide[1]/shape[2]' --prop animation=fadeIn --prop delay=500
# Superscript / subscript (scientific text)
officecli add deck.pptx '/slide[1]/shape[1]' --type run \
--prop text='H' --prop size=18
officecli add deck.pptx '/slide[1]/shape[1]' --type run \
--prop text='2' --prop size=12 --prop subscript=true
# Template merge with data
officecli merge template.pptx output.pptx --data '{"title":"Q4 Report","revenue":"$5.1M"}'
# Watch mode (live preview with auto-refresh)
officecli watch deck.pptx --port 3000
# Slideshow settings
officecli set deck.pptx / --prop show.loop=true --prop show.narration=false
Choose a font pairing with personality — don't default to Arial.
| Header Font | Body Font | Best For |
|---|---|---|
| Georgia | Calibri | Formal business, finance |
| Arial Black | Arial | Bold marketing, launches |
| Trebuchet MS | Calibri | Friendly tech, startups |
| Consolas | Calibri | Developer tools, engineering |
Korean: Pretendard, Noto Sans KR, Wanted Sans.
Avoid as primary: Malgun Gothic (sole), Inter, Roboto, Arial, Calibri — these read as default/template.
Exception: Malgun Gothic acceptable as CJK fallback in a:ea font stack, never as primary.
| Element | Size | Min shape height |
|---|---|---|
| Slide title | 36-44pt bold (≥2× body) | ≥ 2cm |
| Section header | 20-24pt bold | ≥ 1.2cm |
| Body text | 18-22pt (min 18pt) | ≥ 1cm |
| Caption / source | 10-12pt muted | ≥ 0.6cm |
| Key metric | 60-72pt bold, accent color | — |
Body floor is 18pt for audience-facing prose. Four exceptions may go below 18pt: chart axis labels, legends, footer/page number, and ≤5-word KPI sublabels (e.g. "Active users"). Descriptive sentences must be ≥18pt. Rule of thumb: min shape height ≈ font_pt × 0.05cm. Overflow → cut text or split slides, never shrink font; if cards won't fit, drop cards.
Line breaks (manual text-wrap: balance). Break titles/subtitles between thought-units so no line ends with a 1-word (EN) orphan; keep line lengths balanced. Korean: last line ≥4 chars (2 syllable blocks) — never leave "다." / "화." alone. Body line length ~45-65 chars. (from dev-uiux-design typography-line-breaks)
All content slides (not cover/closing) should have speaker notes.
Wrong chart type kills the 3-second test:
| Data shape | Use | Avoid |
|---|---|---|
| Category comparison (A vs B vs C) | column (vertical) / bar (≥6 cats, horizontal) | pie (slices merge), line (no time axis) |
| Time series, 1-3 series | line | area (occlusion), bar (implies discrete) |
| Part-of-whole, 2-5 slices | pie / doughnut | pie with 8+ slices (unreadable) |
| Correlation / distribution | scatter | line (implies ordering) |
| Many categories × metrics, dense | stacked column or heatmap | one chart per metric — consolidate |
| KPI snapshot (single big number) | Large-text shape (60-72pt + ≤5-word sublabel), NOT a chart | gauge chart, tiny bar |
Rule of thumb: if >3 series and >8 categories, split into two charts or switch to a table.
| Content Type | Recommended Layout |
|---|---|
| Pricing / plan tiers | 2-3 column cards (comparison) |
| Team / people | Icon grid or 2x3 cards |
| Timeline / roadmap | Process flow with arrows / numbered steps |
| Key metrics / KPIs | Large stat callouts (3-4 big numbers) |
| Testimonials / quotes | Full-width quote with attribution |
| Feature comparison | Two-column before/after or table |
| Architecture / system | Shapes + connectors diagram |
| Financial data | Chart + summary table side-by-side |
A 10-slide deck needs ≥4 distinct layout types (hero / split / grid / data-viz) — never repeat one layout.
Read the image first; choose treatment from what you see, not from the filename.
Pick ONE distinctive element (rounded image frames, section numbers in filled circles, single-side border band, diagonal accent strips) and carry it to every slide. Declare it in your build plan first (## Motif: numbered circles in brand color). A secondary motif is fine only if it doesn't compete. Styling one slide richly and leaving the rest plain reads as abandoned.
Titles orient on content, not punchline. No "It's not X. It's Y.", no manufactured tension, no faux-insight ("The magic moment"), no one-word drama ("Momentum."). Cut hype adjectives (seamless, robust, game-changing, Elevate, Next-Gen) — let the number carry it. Pick ONE title grammar (all noun-phrases OR all action statements, never mixed) and hold it throughout.
Each = pattern → one-line fix. (Slide-adapted from dev-frontend §5 + built-in AI-tells.)
shape=elbow connectors, arrowheads on every flow.STRICT bans: emoji as iconography (feature/card/section icons) — use a shape or real icon asset; purple gradient on white; FFFFFF bg + 000000 text (use off-black 0A0A0A).
{{name}}, $fy$24, <TODO>, lorem, xxxx, empty ()/[].1E2761, 36454F, deep forest/berry), every body run, card body, chart series, and icon must be FFFFFF or brightness >80%. Mid-gray (6B7B8D ≈44%) vanishes on projection. Spot-check via view html after any dark-fill pass.If any fails, STOP and fix before declaring done.
Step 0 — Title sequence first (plan, don't build yet). Before creating any slide, write the full ordered list of slide titles. If someone reading ONLY the titles can't follow the argument, fix the arc now — cheaper in a list than after 14 slides. Pick ONE title grammar and hold it (see §5.14). Also declare the motif (§5.13) and dials (§5.4) here.
# 1. ASCII 파일명으로 /tmp/ 에서 작업 (한국어 파일명은 resident 깨짐)
officecli create /tmp/deck_work.pptx --type pptx
# 2. add slide (parent is '/', the presentation root) → set background → add shapes/textboxes/charts
officecli add /tmp/deck_work.pptx / --type slide
officecli set /tmp/deck_work.pptx '/slide[1]' --prop background=1E2761
officecli add /tmp/deck_work.pptx '/slide[1]' --type textbox \
--prop 'text=Title Here' --prop x=2cm --prop y=3cm --prop w=30cm --prop h=4cm \
--prop fontsize=44 --prop bold=true --prop color=FFFFFF --prop fontFamily=Pretendard
# 3. 완료 후 resident 명시 종료
officecli close /tmp/deck_work.pptx
# 4. 최종 파일명으로 안전 복사 (한국어 OK)
python3 -c "import shutil; shutil.copy2('/tmp/deck_work.pptx', 'final.pptx')"
Assume there are problems. First render is almost never correct. Zero issues found = you weren't looking hard enough. Any gate failure = REJECT, do not deliver. Done = every gate PASS and Gate 3 loop converged.
officecli validate "<file>". Any schema error → REJECT and fix. (Modern MS chart-extension XML can fail schema yet render in LibreOffice — report as "schema failed, LibreOffice render succeeded".)
officecli view "<file>" issues. Any issue ([O1], [C1], [S1], …) → REJECT, fix, re-run until clean.
officecli view "<file>" text, then scan for xxxx, lorem/ipsum, <TODO>, placeholder, "click to", empty ()/[]. Any hit → REJECT.
officecli validate output.pptx
officecli view output.pptx issues
officecli view output.pptx text | grep -iE 'xxxx|lorem|ipsum|placeholder|TODO|click to'
officecli view output.pptx stats
officecli view output.pptx html --browser
# Thumbnail grid for quick scan: wrapper uses LibreOffice -> pdftoppm -> Pillow
python3 scripts/thumbnail.py output.pptx grid.png
LibreOffice render is visual evidence, not a guarantee that PowerPoint for Mac renders identically.
USE A FRESH SUBAGENT — even for 2-3 slides. The builder is biased toward "looks fine"; a separate pair of eyes is more critical. Hand it the screenshots + this checklist with adversarial framing.
Prompt for visual QA subagent:
Visually inspect these slides. Assume there are issues — find them.
Look for:
- Overlapping elements (text through shapes, stacked elements)
- Text overflow or cut off at box boundaries
- Elements too close (< 0.3" gaps) or nearly touching
- Uneven gaps (large empty area vs cramped)
- Insufficient margin from slide edges (< 0.5")
- Columns or similar elements not aligned
- Low-contrast / dark-on-dark text or icons (fill <30% with text <80%)
- Image treatment: stretched photo, raw text on photo, cropped logo, image floating on white
- Missing arrowheads on flow connectors
- Leftover placeholder content
- Text boxes too narrow causing excessive wrapping
- Title line-break: last line is a single word (EN) or ≤3 chars (KO)
For each slide, list issues or areas of concern, even if minor.
Report ALL issues found.
Fix with officecli set → re-run Gate 3 → repeat until zero new issues; one fix often surfaces another. After 3 rounds without convergence, STOP and report slide N: <issue> — attempted: <fixes> — likely root: <template|design-conflict|ambiguous> for the user to decide. Do not declare success until a fix-verify cycle finds zero new issues.
# Required
python3 -c "import pptx" || echo "MISSING: pip install python-pptx"
# LibreOffice: check only; ask before installing when PDF/thumbnail output is needed.
which soffice >/dev/null 2>&1 || echo "ASK USER: LibreOffice is not installed; install it for PDF conversion/thumbnails or skip that output."
# OfficeCLI: check only; do not auto-install from a skill.
if ! command -v officecli >/dev/null 2>&1; then
echo "ASK USER: install forked OfficeCLI from https://github.com/lidge-jun/OfficeCLI, continue lightweight, or stop."
echo "Install command after approval: bash \"\$(npm root -g)/cli-jaw/scripts/install-officecli.sh\""
fi
Always inspect help before inventing properties:
officecli --help
officecli help pptx
officecli help pptx add slide --json # exact property list
officecli help pptx add shape --json
officecli help pptx set slide --json
officecli help pptx set shape --json
officecli view --help # all view modes
officecli help pptx query
officecli view slides.pptx text
officecli view slides.pptx text --start 1 --end 5
officecli view slides.pptx outline
officecli view slides.pptx annotated
officecli view slides.pptx stats
Paths are 1-based: /slide[1], /shape[1]. Always quote paths in zsh.
officecli get slides.pptx '/slide[1]' --depth 1
officecli get slides.pptx '/slide[1]/shape[1]'
officecli get slides.pptx '/slide[1]/chart[1]'
officecli get slides.pptx '/slide[1]/table[1]' --depth 3
officecli query slides.pptx 'shape:contains("Revenue")'
officecli query slides.pptx "picture:no-alt"
officecli query slides.pptx 'shape[fill=#4472C4]'
officecli query slides.pptx "shape[width>=10cm]"
officecli view slides.pptx html --browser # recommended
officecli view slides.pptx svg --start 1 --end 1 --browser
officecli open slides.pptx # returns IMMEDIATELY; daemon in bg
officecli add slides.pptx ...
officecli set slides.pptx ...
officecli close slides.pptx # always close explicitly
Do NOT run
officecli openas a background shell job. It returns immediately and the daemon lives in the background automatically. Running it as a monitored shell creates zombies and file locks.
cat <<'EOF' | officecli batch slides.pptx
[
{"command":"add","parent":"/slide[1]","type":"shape","props":{"text":"Title","x":"2cm","y":"2cm","width":"20cm","height":"3cm","size":"36","bold":"true"}},
{"command":"add","parent":"/slide[1]","type":"shape","props":{"text":"Body","x":"2cm","y":"6cm","width":"20cm","height":"10cm","size":"16"}}
]
EOF
Batch supports: add, set, get, query, remove, move, swap, view, raw, raw-set, validate.
Error decoding:
'X' is an invalid start of a value= shell syntax leaked into JSON. Use heredoccat <<'EOF' | officecli batch FILEwith single-quoted delimiter.
| Pitfall | Correct Approach |
|---|---|
Unquoted [N] in zsh | Always quote: "/slide[1]" or '/slide[1]' |
--name "foo" | Use --prop name="foo" — all attributes through --prop |
| Guessing property names | Run officecli help pptx set shape --json for exact names |
Hex colors with # | Use FF0000 not #FF0000 |
$ in --prop text= | Use single quotes: '$15M' |
view text misses tables | Use view annotated for full text |
| Chart series after creation | Cannot add — delete and recreate |
| Korean filename + resident | CJK causes resident UTF-8 corruption. Use ASCII, then copy. If stuck: pkill -9 -f "resident-serve" |
| Resident zombie | pkill -9 -f "resident-serve", wait 1s, retry |
| Recreating theme/masters that exist | cp source.pptx target.pptx first. Keep /slideMaster, /slideLayout, /theme. See §2 |
officecli open as background shell | Run foreground — returns immediately, daemon runs in bg automatically. Background shell spawn creates zombies |
Batch JSON 'X' is an invalid start of a value | Shell syntax leaked. Use heredoc: cat <<'EOF' | officecli batch FILE.pptx |
| Picking colors/fonts blindly | Read references/design-system.md (20 palettes, 8 font pairings) BEFORE picking. See §3 |
Using old officecli pptx set shape syntax | Use officecli help pptx set shape --json; schema help now lives under officecli help <format> ... |
officecli query deck.pptx 'picture:no-alt'y + height <= 19.05cm, x + width <= 33.87cmTBD, ())See recipes.md for 3 copy-paste repair patterns:
lorem, ipsum, XXXX, TODOMalgun Gothic as sole font = rejectedview issues "(untitled)" for blank-layout is expected, not a defectcp first. See §2references/design-system.md + morph-ppt/reference/styles/INDEX.md (§3) BEFORE defaulting to generic blue + Arialcli-jaw fork auto-detects Korean and applies language tags + default fonts.
officecli validate deck.pptx
officecli view deck.pptx issues
officecli view deck.pptx stats
officecli view deck.pptx outlineofficecli query deck.pptx 'picture:no-alt'| Tool | Purpose | Status |
|---|---|---|
officecli (PATH) | Recommended advanced PPTX backend; fork source is https://github.com/lidge-jun/OfficeCLI | Optional; ask before install |
pptxgenjs | Large programmatic generation (L5) | Optional |
python3 | Scripts (scripts/*.py) for L3 | Required for L3/L4 |
soffice | PDF conversion for QA | Optional |