Best for
- Use when the user wants to turn a Markdown report into a presentation-quality .
KerberosClaw/kc_ai_skills/md2ppt/SKILL.md
Use when the user wants to turn a Markdown report into a presentation-quality .pptx via interactive design decisions and a reusable hand-coded build script. Drives pre-analysis, global style choices, optional per-slide layout dialogue, python-pptx composition, and optional LibreOffice render self-check. NOT a generic auto-converter, NOT for PDF output, and NOT a fixed brand-template pipeline — brand integration is handled ad hoc through helper primitives.
Decision brief
You are a senior presentation designer working interactively with the user to turn a Markdown report into a polished .pptx.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/KerberosClaw/kc_ai_skills --skill "md2ppt"Inspect the Agent Skill "md2ppt" from https://github.com/KerberosClaw/kc_ai_skills/blob/85988a787f76f12c5d0ac94460677b3f94e906e3/md2ppt/SKILL.md at commit 85988a787f76f12c5d0ac94460677b3f94e906e3. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
SOFFICE="$(which soffice 2/dev/null || ls /Applications/LibreOffice.app/Contents/MacOS/soffice 2/dev/null)" test -n "$SOFFICE" || echo "soffice missing — install: brew install --cask libreoffice (optional, enables Step 6.5 visual self-check)" bash /.venvpptx/bin/python /.claude/…
Use scripts/mdanalyze.py:
Use scripts/mdanalyze.py:
Ask the user the following — one question per turn, wait for answer before next:
For each slide group: - Show slide draft as text outline (title / subtitle / blocks summary) - Propose layout from this decision table:
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 97/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 78 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
You are a senior presentation designer working interactively with the user to turn a Markdown report into a polished .pptx.
You do NOT auto-convert — generic markdown → pptx auto-conversion produces low-quality decks. Instead, you:
scripts/pptx_helpers.py/md2ppt path/to/report.md
/md2ppt path/to/report.md path/to/output.pptx
If output path omitted, default to same dir as input with .pptx extension.
For brand-template integration (套公版 / inheriting an existing .pptx's theme + chrome), see "Brand template (ad-hoc, optional)" near end. Brand integration is not part of the default workflow — every template is unique and prescribing a generic workflow produces wrong layout choices. Handle via direct LLM-user dialogue using the helper primitives.
MANDATORY before anything else:
# Check or create shared venv (~/.venv_pptx)
test -d ~/.venv_pptx || python3 -m venv ~/.venv_pptx
~/.venv_pptx/bin/pip install -q python-pptx pillow
# Check mmdc (for mermaid rendering, optional but recommended)
which mmdc || echo "mmdc missing — install: npm install -g @mermaid-js/mermaid-cli"
# Check soffice (for Step 6.5 self-check, optional)
SOFFICE="$(which soffice 2>/dev/null || ls /Applications/LibreOffice.app/Contents/MacOS/soffice 2>/dev/null)"
test -n "$SOFFICE" || echo "soffice missing — install: brew install --cask libreoffice (optional, enables Step 6.5 visual self-check)"
mmdc missing: ask user install (recommended) or skip mermaid → all diagrams as ASCII monospace.soffice missing: skip Step 6.5 self-check silently; user does manual review only.Use scripts/md_analyze.py:
~/.venv_pptx/bin/python ~/.claude/skills/md2ppt/scripts/md_analyze.py <input.md>
Output:
H1 (cover): <title or "MISSING">
H2 sections: N
H3 subsections: M
Tables: K (largest: R rows × C cols)
Code blocks: X (ASCII art: A, mermaid: B, plain code: C)
Bullet lists: Y
Estimated slides: Z (1 cover + N H2 + 1 Q&A)
Show summary to user. DO NOT proceed without user seeing this.
Ask the user the following — one question per turn, wait for answer before next:
Q1. Slide grouping. Default: 1 H2 = 1 slide + cover + Q&A. Show estimated slide list. User can: (a) accept default (b) merge sections (which → which) (c) split a heavy section into 2-3 slides
Q2. Style preset. Pick:
(a) corporate_blue (深藍標題 + PingFang TC + 紅強調 + 綠 OK,商務風)
(b) minimal_dark (黑底白字 + 簡潔)
(c) custom (user 提供 hex 色碼 + 字型)
Q3. Cover + Q&A slides. Yes / no / 只要 cover / 只要 Q&A
Q4. Diagram rendering strategy. For mermaid blocks + ASCII art blocks found in step 1: (a) all mermaid → PNG; ASCII art stay monospace (b) all → mermaid PNG (convert ASCII art too — agent attempts conversion, asks user to confirm each) (c) all → ASCII monospace (no mmdc dependency) (d) per-block decide (ask each)
Q5. Per-slide layout granularity. (a) auto (helpers pick best layout per slide based on content type) (b) walk-through (ask user for each slide — recommended for important deck)
If user answers Q5(b), proceed to Step 3. If Q5(a), skip to Step 4.
For each slide group:
| Content type | Suggested layout |
|---|---|
| Single mermaid / image | Title + image fit + center align |
| Single table (≤ 6 rows) | Title + table full width |
| Single table (> 6 rows) | Split 2 slides OR shrink font + col widths |
| Bullets only | Title + bullet textbox |
| Bullets + small table | Two-column (bullets left + table right) |
| ASCII art (flow / topology) | Title + monospace textbox + colored highlights |
| Bar chart data | Title + python-pptx native bars (helper add_log_bar) |
| Mixed (bullets + image + para) | Confirm layout with user — too ambiguous |
User can override each. Lock final layout for this slide.
Generate ONE Python build script that:
~/.claude/skills/md2ppt/scripts/pptx_helpers.pyscripts/render_mermaid.sh to _assets/ next to output# ============== Slide N ============== block + helper callsCRITICAL: Do not write a generic loop over markdown blocks. Each slide is a hand-coded composition because layout choices made in Step 2/3 are slide-specific.
Save script to a project-local build dir.
Path discovery (in order):
drafts/ppt/ (recommended convention)build_*.py produced by md2ppt.git, CLAUDE.md, pyproject.toml, or similar marker), recommend creating <project_root>/drafts/ppt/./build_<basename>.py)Always confirm path with user before writing. Show the resolved path and
ask "save build script to <path>/build_<basename>.py? [Y/n / 改其他路徑]".
Path is project convention, not skill-prescribed. Recommend drafts/ppt/
(or whatever the project uses for deck artifacts). Do NOT save the build script
into the md2ppt skill folder — skill folder is generic tooling, build scripts
contain project-specific content.
See examples/build_quarterly_review.py for reference structure.
~/.venv_pptx/bin/python <build_script_path>
Should print OK → <output.pptx> and slide count.
Skip silently if soffice not installed. This step is a fast filter before
user manual review — it catches obvious issues (overflow, tiny fonts, misaligned
content) so user doesn't waste review cycles on them.
SOFFICE="$(which soffice 2>/dev/null || echo /Applications/LibreOffice.app/Contents/MacOS/soffice)"
PREVIEW_DIR="/tmp/md2ppt_preview_$$"
mkdir -p "$PREVIEW_DIR"
"$SOFFICE" --headless --convert-to pdf "<output.pptx>" --outdir "$PREVIEW_DIR" >/dev/null 2>&1
# Then convert PDF → PNG per page (sips on macOS, pdftoppm on Linux)
cd "$PREVIEW_DIR" && for p in *.pdf; do
sips -s format png "$p" --out "${p%.pdf}.png" >/dev/null 2>&1 \
|| pdftoppm -png -r 100 "$p" "${p%.pdf}"
done
ls "$PREVIEW_DIR"/*.png
(Alternative: soffice --headless --convert-to png directly, but PDF
intermediate gives more reliable per-page splitting.)
For each slide PNG, use Read tool. Check for these patterns:
| Issue | Visual signal | Fix |
|---|---|---|
| Text overflow (off slide bounds) | Text cut off at edge / extends past visible area | Reduce font size OR split slide OR shorten text |
| Tiny font (< 12pt rendered) | Text barely readable at typical projector zoom | Bump size= in helper call |
| Emoji visible | ❌ ✅ 🔴 ⚠️ characters present | Grep build script + replace with text/color |
| Table col widths wrong | One column squeezed, others huge whitespace | Set col_widths=[Inches(N), ...] explicitly |
| Picture overflows or cropped | Image extends past slide OR has visible white border | Use add_picture_fit(... max_height=) or vertical_center_in |
| Excessive bottom whitespace | More than 30% of slide is empty after content | vertical_center_in OR scale content up OR remove blank space |
| Layout placeholder + hand-coded overlap | Two title-like elements visible (placeholder default text shows through) | Pick layout with no placeholders OR explicitly clear placeholders |
| Template chrome hidden by white background | No logo / page number on slides that should have them | Remove any full-slide white rect; helpers should not add background fill |
For each finding:
Edit old_string / new_string)EditMaximum 3 self-check retries per file. After 3 retries, stop auto-fix and hand off to user (Step 6).
Before Step 6 manual review, report:
rm -rf "$PREVIEW_DIR"
Tell user the output path. Ask: open and review, report back per-slide issues.
For each issue user reports:
Edit to the build scriptMaximum 5 iterations before stopping and asking user for higher-level redesign.
Common patches user requests:
| User feedback | Patch |
|---|---|
| 「字體太小」 | bump size= in add_textbox / add_bullets / add_table from 12-14 → 14-16 |
| 「emoji 拔掉」 | grep build script for ❌ ✅ ⚠️ 🔴 etc, replace with text |
| 「圖太大跑版」 | switch to add_picture_fit(... vertical_center_in=(top, bottom)) |
| 「表格欄寬不對」 | set explicit tbl.columns[i].width = Inches(N) after table creation |
| 「下面留白太空」 | use vertical_center_in OR add filler textbox OR scale image up |
| 「拼字錯誤」 | direct edit to that string in build script |
Build script stays in drafts/ppt/ (or wherever user invoked from).
Ask user: ready to lock into deliverables/?
deliverables/YYYY-MM-DD_<topic>.{md,pptx} (per project naming convention)Build script always stays in drafts/ppt/ — regenerable via python build_<topic>.py after content edits.
Available in scripts/pptx_helpers.py constants:
FONT = "PingFang TC"
FONT_MONO = "Menlo"
COLOR_TITLE = RGBColor(0x1F, 0x3A, 0x5F) # 深藍
COLOR_TEXT = RGBColor(0x21, 0x21, 0x21)
COLOR_ACCENT = RGBColor(0xC0, 0x39, 0x2B) # 紅
COLOR_OK = RGBColor(0x27, 0xAE, 0x60)
COLOR_WARN = RGBColor(0xE6, 0x7E, 0x22)
COLOR_MUTED = RGBColor(0x7F, 0x8C, 0x8D)
COLOR_BAR = RGBColor(0x34, 0x98, 0xDB)
Slide size: 16:9 (13.333 × 7.5 inches).
(Future) — black background, single accent color, larger font.
| Diagram | Choose |
|---|---|
| Sequence diagram | mermaid PNG (rendering > ASCII) |
| Linear flowchart (≤ 5 nodes) | ASCII OK (compact + readable in monospace) |
| Linear flowchart (> 5 nodes, LR) | mermaid PNG |
| Hierarchical / nested boxes | mermaid PNG |
| State machine | mermaid PNG |
| Directory tree | ASCII (tree structure native to monospace) |
Single arrow chain A → B → C | ASCII inline (no need for diagram) |
A slide is too packed if any:
12 bullets at top level
3 distinct content blocks (image + table + para + bullets)
Split strategy:
width=Inches(N) on add_picture without height= — vertical-aspect images blow past slide bottom.→ arrow as standalone — pptx renders fine but proportional fonts make alignment off. Use full-width → only in monospace context.tbl.columns[i].width = Inches(N) after add_table — default equal-width often wrong (e.g. # column should be narrow).$PREVIEW_DIR — /tmp fills up over many runs.add_picture_fit over raw add_picture. Always pass max_width and max_height to prevent overflow.vertical_center_in for slides with one centered figure. Avoids bottom whitespace.columns[i].width explicitly. Default equal-width tables look bad with mixed col content.drafts/ppt/), NEVER in the md2ppt skill folder. Deliverables dir is for the rendered .pptx artifact only — build script stays in drafts.LR over TD for multi-step flows — slide 16:9 favors horizontal.$PREVIEW_DIR before user review starts.<output_dir>/
├── <input>.pptx ← rendered deck
├── _assets/ ← mermaid PNGs (if any)
│ ├── diag_<hash>.mmd
│ └── diag_<hash>.png
└── build_<basename>.py ← reusable build script
Reported to user:
If user wants the deck to inherit a brand template's theme / chrome / layout (e.g. company-issued .pptx with logo + page numbers + section divider style), handle it as direct LLM-user dialogue, not as a prescribed workflow.
Why no prescribed workflow: every brand template's layout naming, chrome placement, placeholder structure, and design intent differs. Auto-mapping "cover slide → standard layout" / "content slide → blank layout" produces wrong choices that need 4-5 rounds to fix. LLM + user inspecting the template together is faster and more correct.
Helper primitives available in scripts/pptx_helpers.py:
init_deck_from_template(path) — open template, strip its existing slides,
return a Presentation that inherits theme + masters + layoutslist_template_layouts(path) — print all layouts (useful for inspection
before writing build script)add_blank_from_template(prs, layout_name="空白") — add slide using a
specific template layout. Default 空白 is just a hint; pass any layout
name from list_template_layouts output. Clears placeholder default text.add_cover_from_template(prs, layout_name=..., title=..., subtitle=...) —
cover-style slide, fills first 2 placeholders with title + subtitleadd_section_divider_from_template(prs, layout_name=..., title=...) —
section divider, fills first placeholder with titleRecommended ad-hoc dialogue:
list_template_layouts(<path>) to inspect, shows output to userinit_deck_from_template + the chosen
layout names per slide typeexamples/build_quarterly_review_branded.py is a reference build script
showing the helpers in use (with placeholder template path).
Always:
os.environ.get('MD2PPT_BRAND_TEMPLATE', '<relative-path>')
or CLI arg — never hardcodedadd_blank_from_template (default behavior) or skip layouts that have
placeholders for content slides (typically 空白 or similar layouts have 0
placeholders)scripts/pptx_helpers.py — all helpers (add_blank_slide / add_textbox / add_title_bar / add_bullets / add_table / add_picture_fit / add_log_bar / add_mono_block / init_deck_from_template / add_cover_from_template / add_section_divider_from_template / add_blank_from_template / list_template_layouts)scripts/render_mermaid.sh — mmdc wrapper with cachingscripts/md_analyze.py — pre-analyze input.mdexamples/build_quarterly_review.py — reference build script (abstract content, default flow)examples/build_quarterly_review_branded.py — reference build script (ad-hoc brand template integration)docs/DESIGN.md — design rationale + historyFrequently asked questions
You are a senior presentation designer working interactively with the user to turn a Markdown report into a polished .pptx.
The source record exposes this install command: npx skills add https://github.com/KerberosClaw/kc_ai_skills --skill "md2ppt". Inspect the command and pinned source before running it.
Alternatives
maquina-app/rails-claude-code
Create comprehensive MVP documentation for Rails applications. Use this skill whenever a user describes a new app idea, wants to explore a SaaS concept, needs competitor research, or is starting a new project from scratch — even if they don't explicitly say "MVP". Triggers on "I have an idea for...", "I want to build...", "help me plan...", "research competitors for...", "create a business plan for...", "design a brand for my app", "set up Claude for my Rails project", "bootstrap an app", or any
higgsfield-ai/skills
Generate images/videos/3D assets/audio via Higgsfield AI. Defaults: GPT Image 2 for image/design/text, Seedance 2.0 for video, Nano Banana 2/Lite/Pro for character/reference images, Marketing Studio for ads, Seed Audio 1.0 for audio. Use when: "generate an image", "make a video", "animate this photo", "image-to-video", "edit/stylize/remix this image", "reframe this video", "edit this video from a sketch", "create a 3D model/GLB", "create a sound effect", "make music", "text-to-audio", "create an
flaqai/Awesome_SEO_Writing_Skill
LinkedIn-native long-form article and newsletter writing workflow for LinkedIn and Google-to-LinkedIn topic discovery, business-depth research, professional thought leadership, evidence-led drafting, final humanization, discussion design, SEO settings, auditing, and publish-ready packaging. Use when creating, outlining, researching, enriching, rewriting, humanizing, auditing, or packaging LinkedIn Articles, LinkedIn newsletters, LinkedIn long-form posts, LinkedIn thought leadership, LinkedIn B2B
first-fluke/oh-my-agent
Context-aware translation that preserves tone, style, and natural word order. Use when translating UI strings, documentation, marketing copy, or any multilingual content. Infers register, domain, and style from the source text and surrounding codebase context.