[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6HPX80949G84ZCGGK6KAD8H":3,"skill-same:01M6HPX80949G84ZCGGK6KAD8H":108},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":30,"linkOnly":31,"markdownContent":32,"markdownBody":33,"frontMatter":34,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":6,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":62,"install":63,"resources":76},"01M6HPX80949G84ZCGGK6KAD8H","lighting-setups",null,"Professional lighting setups for BlenderWeave — three-point, studio, product, architectural, and dramatic lighting recipes with manage_lights parameters.","pedronaugusto\u002Fblender-weave","pedronaugusto","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F16762743?v=4","01M6HPX2VRKA8WM7J6HB3AHXAE","Pedro Augusto","01M6HPX30EFSJ68B7XT70Z2E4K",8,"MIT","https:\u002F\u002Fgithub.com\u002Fpedronaugusto\u002Fblender-weave\u002Fblob\u002Fmain\u002Fclaude-plugin\u002Fskills\u002Flighting-setups\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29],"lighting","lighting setups","product","manage","three","recipes","professional","with","studio","for","point","2026-11-10 10:12:30",false,"---\nname: powerpoint\ndescription: Create, read, edit .pptx decks with python-pptx.\nversion: 1.1.0\nauthor: Nous Research\nlicense: MIT\nplatforms: [linux, macos, windows]\nmetadata:\n  hermes:\n    tags: [pptx, powerpoint, presentations, slides, office, python-pptx]\n    category: productivity\n    related_skills: [docx, xlsx, pdf]\n---\n\n# Powerpoint Skill\n\nCreate, inspect, and edit PowerPoint (.pptx) presentations using the\npython-pptx library. Five helper scripts cover deck creation from a JSON\nspec, structured read-back, in-place edits, template-driven brand decks,\nand slide rendering — all offline, no PowerPoint installation required.\n\n## When to Use\n\n- The user asks to build a slide deck, report presentation, or pitch deck.\n- You need to extract text, notes, tables, chart data, or images from a\n  .pptx someone shared.\n- You need to update an existing deck: replace text, refresh or patch\n  chart data, swap a logo, duplicate\u002Fremove\u002Freorder slides, set\n  backgrounds, footers, hyperlinks, or speaker notes.\n- You must produce an on-brand deck from a company .pptx template.\n- Do NOT use this for .ppt (legacy binary) files — convert them first with\n  `soffice --convert-to pptx old.ppt` if LibreOffice is available.\n\n## Prerequisites\n\n- Python 3.10+ with `python-pptx` installed\n  (`pip install python-pptx`).\n- Optional: LibreOffice (`soffice`) plus poppler (`pdftoppm` or\n  `pdftocairo`) for rendering slides to PNGs and for PDF export.\n  `pptx_render.py` detects both with `shutil.which` and degrades\n  gracefully (reports `{\"rendered\": false, \"missing\": [...]}`, exit 0)\n  when absent — all create\u002Fread\u002Fedit operations work without them.\n- Check availability via `terminal`:\n  `python -c \"import pptx; print(pptx.__version__)\"` and `which soffice pdftoppm`.\n\n## How to Run\n\nAll scripts live in `scripts\u002F`, take `--help`, print JSON to stdout, and\nexit non-zero on failure. Run them with `terminal`:\n\n```bash\npython scripts\u002Fpptx_create.py deck.json out.pptx\npython scripts\u002Fpptx_read.py deck.pptx --outline      # full JSON outline\npython scripts\u002Fpptx_read.py deck.pptx --notes        # speaker notes\npython scripts\u002Fpptx_read.py deck.pptx --images .\u002Fimg # export pictures\npython scripts\u002Fpptx_edit.py deck.pptx --replace-text \"Old Corp\" \"New Corp\"\npython scripts\u002Fpptx_edit.py deck.pptx --chart-data update.json\npython scripts\u002Fpptx_edit.py deck.pptx --duplicate-slide 2\npython scripts\u002Fpptx_edit.py deck.pptx --remove-slide 3 --move-slide 2 0\npython scripts\u002Fpptx_from_template.py brand.pptx out.pptx --values vals.json\npython scripts\u002Fpptx_render.py deck.pptx --outdir .\u002Frender  # slide PNGs\n```\n\nAuthor JSON specs with `write_file`; inspect script output and generated\nJSON with `read_file`.\n\n## Quick Reference\n\n| Task | Command |\n|---|---|\n| New deck from spec | `pptx_create.py spec.json out.pptx` |\n| 16:9 vs 4:3 | `\"slide_size\": \"16:9\"` or `\"4:3\"` in the spec |\n| Outline as JSON | `pptx_read.py deck.pptx --outline` |\n| Export images | `pptx_read.py deck.pptx --images DIR` |\n| Replace text | `pptx_edit.py deck.pptx --replace-text OLD NEW` |\n| Replace chart data | `pptx_edit.py deck.pptx --chart-data spec.json` |\n| Patch one series | same flag, spec with `\"ops\"` (see below) |\n| Swap picture | `pptx_edit.py deck.pptx --swap-image N NAME new.png` |\n| Duplicate slide | `pptx_edit.py deck.pptx --duplicate-slide N` |\n| Remove slide | `pptx_edit.py deck.pptx --remove-slide N` |\n| Reorder slide | `pptx_edit.py deck.pptx --move-slide FROM TO` |\n| Slide background | `pptx_edit.py deck.pptx --set-background N RRGGBB` |\n| Hyperlink runs | `pptx_edit.py deck.pptx --hyperlink N TEXT URL` |\n| Slide number on | `pptx_edit.py deck.pptx --enable-slide-number N` |\n| Footer text | `pptx_edit.py deck.pptx --set-footer N TEXT` |\n| Set notes | `pptx_edit.py deck.pptx --set-notes N TEXT` |\n| Append notes | `pptx_edit.py deck.pptx --append-notes N TEXT` |\n| Fill template | `pptx_from_template.py tpl.pptx out.pptx --values v.json` |\n| Render slide PNGs | `pptx_render.py deck.pptx --outdir DIR` |\n\n## Procedure\n\n### 1. Create a deck\n\nWrite a JSON spec (see `pptx_create.py --help` for the full format), then\nrun `pptx_create.py`. Per slide you can set: `layout` (title,\ntitle_content, section, two_content, title_only, blank), `title`,\n`subtitle`, `bullets` (strings, or dicts with `level` 0-4, `size` pt,\n`bold`, `italic`, `font`, `color` hex, `link` URL for a hyperlink),\n`background` (solid hex), `footer` (text; enables the layout's footer\nplaceholder), `slide_number` (true; enables the layout's slide-number\nplaceholder), `images` (path + left\u002Ftop\u002Fwidth\u002Fheight in inches), `tables`\n(`rows` as list-of-lists), `shapes` (rectangle, rounded_rectangle, oval,\ndiamond, right_arrow, chevron, with `fill` hex + optional `text`),\n`charts` (bar, bar_h, line, pie with `categories` + `series`), and\n`notes` (speaker notes).\n\n### 2. Read a deck\n\n`pptx_read.py deck.pptx --outline` returns slide size, layout inventory,\nand per slide: layout name, all shape texts, table cells, image inventory\n(filename\u002Fext\u002Fbytes), chart categories\u002Fseries\u002Fvalues, and speaker notes.\nUse `--images DIR` to dump embedded pictures to files, then\n`vision_analyze` on any exported image if you need to see its content.\n\n### 3. Edit a deck\n\n`pptx_edit.py` combines operations in one pass; use `--output` to keep the\noriginal. Text replacement scans slide shapes, table cells, and notes.\nImage swap retargets the picture's relationship id so position and size\nare preserved. Slide removal drops the relationship and the `\u003Cp:sldId>`\nentry; reorder moves the `\u003Cp:sldId>` element within `\u003Cp:sldIdLst>`\n(python-pptx has no public API for either — the script does the XML-level\nwork). `--duplicate-slide N` appends an independent deep copy of slide N:\nshape XML plus image\u002Fmedia\u002Fhyperlink relationships are cloned and rIds\nremapped, so editing the copy never touches the original. Chart slides\nare refused (see Pitfalls). `--set-notes`\u002F`--append-notes` edit speaker\nnotes; `--set-background`, `--hyperlink`, `--enable-slide-number`, and\n`--set-footer` handle deck polish.\n\nChart updates take a JSON spec via `--chart-data`. Full replace:\n`{\"slide\": 0, \"chart\": 0, \"categories\": [...], \"series\": {...}}`. For\nsurgical edits, pass `\"ops\"` instead — a list of\n`{\"op\": \"update_series\", \"name\": ..., \"values\": [...]}`,\n`add_series`, `remove_series`, `rename_category` (`from`\u002F`to` or\n`index`), and `set_title`. python-pptx can only swap a chart's entire\ndataset (`replace_data`), so ops are implemented as read-existing →\nmodify → replace; the per-part UX is a wrapper, and any chart data not\nexpressible as categories + numeric series will be normalized by the\nround-trip.\n\n### 4. Build from a template\n\n`pptx_from_template.py` opens a brand .pptx, replaces every\n`{{token}}` from a values JSON across slides\u002Ftables\u002Fnotes, and can append\nnew slides that use the template's own layouts (by layout name or index)\nso they inherit the master's fonts and colors. Tip: to start from a\ntemplate with zero slides, delete existing ones afterward with\n`pptx_edit.py --remove-slide`.\n\n### 5. Visual verification\n\n`pptx_render.py deck.pptx --outdir .\u002Frender` converts the deck to PDF\nwith `soffice --headless` and splits it into one PNG per slide with\n`pdftoppm` (or `pdftocairo`). Output JSON lists the PNG paths — review\neach with `vision_analyze`. When either tool is missing the script exits\n0 with `{\"rendered\": false, \"missing\": [...]}` and guidance; fall back to\nthe JSON outline from `pptx_read.py`, which verifies content and\nstructure, just not visuals.\n\n## Converting to PDF\n\nIf LibreOffice is installed, export the finished deck to PDF directly:\n\n```bash\nsoffice --headless --convert-to pdf --outdir .\u002Fout deck.pptx\n```\n\nThe output lands at `.\u002Fout\u002Fdeck.pdf`. Fonts not installed on the host are\nsubstituted, so render-verify (Procedure step 5) before shipping the PDF.\nThere is no offline pure-Python .pptx→PDF path; if `soffice` is absent,\nsay so rather than approximating.\n\n## Pitfalls\n\n- **Run splitting**: PowerPoint fragments paragraph text into runs at\n  spell-check and edit boundaries. `--replace-text` first merges adjacent\n  runs whose formatting is identical, so matches split across such runs\n  are replaced with formatting fully preserved. Only when a match spans\n  *genuinely differently-formatted* runs is the paragraph rewritten with\n  the first run's formatting — verify those slides after replacement.\n- **Chart slides cannot be duplicated**: each chart relationship embeds a\n  separate XLSX workbook part; cloning that graph reliably is not\n  supported, so `--duplicate-slide` refuses chart slides cleanly instead\n  of corrupting the deck. Rebuild the chart on a new slide instead.\n  External-hyperlink and image\u002Fmedia rels are carried over; layout and\n  notes rels are recreated fresh.\n- **Chart ops are a wrapper**: python-pptx replaces the whole dataset;\n  `\"ops\"` round-trips existing plot data through `replace_data`, and\n  changing chart *type* is not possible.\n- **Reordering is XML-level**: python-pptx has no supported reorder API.\n  `--move-slide` manipulates `\u003Cp:sldIdLst>` directly; safe for ordinary\n  decks but re-read the deck afterward to confirm.\n- **Copying slides between decks is unsupported** — duplication works\n  only within one deck, where layouts and masters are shared.\n- Footer\u002Fslide-number enablement copies the placeholder from the slide's\n  layout; on layouts without those placeholders, `--set-footer` fails\n  with a clear message (add a textbox instead).\n- Hyperlinks apply to whole runs; `--hyperlink` links every run\n  containing the given text on that slide.\n- The default python-pptx template is 4:3; the create script sets 16:9\n  unless the spec says otherwise. Custom templates keep their own size.\n- Layout indexes vary by template. For brand templates, list layout names\n  first: `pptx_read.py template.pptx --outline` (`layouts_available`).\n- `slide.shapes.title` is None on blank layouts — the create script\n  handles this, but remember it when writing ad-hoc python-pptx code.\n- Always pass `encoding=\"utf-8\"` when writing spec files; tokens like\n  `{{city}}` may be filled with non-ASCII values.\n\n## Verification\n\n1. After any create\u002Fedit, run `pptx_read.py OUT.pptx --outline` and check\n   slide count, texts, tables, notes, and chart values match intent.\n2. `--images DIR` then file-size check confirms pictures embedded.\n3. Render every slide with `pptx_render.py deck.pptx --outdir .\u002Frender`\n   and review each PNG with `vision_analyze` — this catches overlapping\n   shapes, truncated text, and color problems the outline cannot. If the\n   render tools are missing, the script says so; rely on the outline.\n4. The bundled test suite is the full contract:\n   `python -m pytest tests\u002F -q` (requires python-pptx + pytest).\n","# Powerpoint Skill\n\nCreate, inspect, and edit PowerPoint (.pptx) presentations using the\npython-pptx library. Five helper scripts cover deck creation from a JSON\nspec, structured read-back, in-place edits, template-driven brand decks,\nand slide rendering — all offline, no PowerPoint installation required.\n\n## When to Use\n\n- The user asks to build a slide deck, report presentation, or pitch deck.\n- You need to extract text, notes, tables, chart data, or images from a\n  .pptx someone shared.\n- You need to update an existing deck: replace text, refresh or patch\n  chart data, swap a logo, duplicate\u002Fremove\u002Freorder slides, set\n  backgrounds, footers, hyperlinks, or speaker notes.\n- You must produce an on-brand deck from a company .pptx template.\n- Do NOT use this for .ppt (legacy binary) files — convert them first with\n  `soffice --convert-to pptx old.ppt` if LibreOffice is available.\n\n## Prerequisites\n\n- Python 3.10+ with `python-pptx` installed\n  (`pip install python-pptx`).\n- Optional: LibreOffice (`soffice`) plus poppler (`pdftoppm` or\n  `pdftocairo`) for rendering slides to PNGs and for PDF export.\n  `pptx_render.py` detects both with `shutil.which` and degrades\n  gracefully (reports `{\"rendered\": false, \"missing\": [...]}`, exit 0)\n  when absent — all create\u002Fread\u002Fedit operations work without them.\n- Check availability via `terminal`:\n  `python -c \"import pptx; print(pptx.__version__)\"` and `which soffice pdftoppm`.\n\n## How to Run\n\nAll scripts live in `scripts\u002F`, take `--help`, print JSON to stdout, and\nexit non-zero on failure. Run them with `terminal`:\n\n```bash\npython scripts\u002Fpptx_create.py deck.json out.pptx\npython scripts\u002Fpptx_read.py deck.pptx --outline      # full JSON outline\npython scripts\u002Fpptx_read.py deck.pptx --notes        # speaker notes\npython scripts\u002Fpptx_read.py deck.pptx --images .\u002Fimg # export pictures\npython scripts\u002Fpptx_edit.py deck.pptx --replace-text \"Old Corp\" \"New Corp\"\npython scripts\u002Fpptx_edit.py deck.pptx --chart-data update.json\npython scripts\u002Fpptx_edit.py deck.pptx --duplicate-slide 2\npython scripts\u002Fpptx_edit.py deck.pptx --remove-slide 3 --move-slide 2 0\npython scripts\u002Fpptx_from_template.py brand.pptx out.pptx --values vals.json\npython scripts\u002Fpptx_render.py deck.pptx --outdir .\u002Frender  # slide PNGs\n```\n\nAuthor JSON specs with `write_file`; inspect script output and generated\nJSON with `read_file`.\n\n## Quick Reference\n\n| Task | Command |\n|---|---|\n| New deck from spec | `pptx_create.py spec.json out.pptx` |\n| 16:9 vs 4:3 | `\"slide_size\": \"16:9\"` or `\"4:3\"` in the spec |\n| Outline as JSON | `pptx_read.py deck.pptx --outline` |\n| Export images | `pptx_read.py deck.pptx --images DIR` |\n| Replace text | `pptx_edit.py deck.pptx --replace-text OLD NEW` |\n| Replace chart data | `pptx_edit.py deck.pptx --chart-data spec.json` |\n| Patch one series | same flag, spec with `\"ops\"` (see below) |\n| Swap picture | `pptx_edit.py deck.pptx --swap-image N NAME new.png` |\n| Duplicate slide | `pptx_edit.py deck.pptx --duplicate-slide N` |\n| Remove slide | `pptx_edit.py deck.pptx --remove-slide N` |\n| Reorder slide | `pptx_edit.py deck.pptx --move-slide FROM TO` |\n| Slide background | `pptx_edit.py deck.pptx --set-background N RRGGBB` |\n| Hyperlink runs | `pptx_edit.py deck.pptx --hyperlink N TEXT URL` |\n| Slide number on | `pptx_edit.py deck.pptx --enable-slide-number N` |\n| Footer text | `pptx_edit.py deck.pptx --set-footer N TEXT` |\n| Set notes | `pptx_edit.py deck.pptx --set-notes N TEXT` |\n| Append notes | `pptx_edit.py deck.pptx --append-notes N TEXT` |\n| Fill template | `pptx_from_template.py tpl.pptx out.pptx --values v.json` |\n| Render slide PNGs | `pptx_render.py deck.pptx --outdir DIR` |\n\n## Procedure\n\n### 1. Create a deck\n\nWrite a JSON spec (see `pptx_create.py --help` for the full format), then\nrun `pptx_create.py`. Per slide you can set: `layout` (title,\ntitle_content, section, two_content, title_only, blank), `title`,\n`subtitle`, `bullets` (strings, or dicts with `level` 0-4, `size` pt,\n`bold`, `italic`, `font`, `color` hex, `link` URL for a hyperlink),\n`background` (solid hex), `footer` (text; enables the layout's footer\nplaceholder), `slide_number` (true; enables the layout's slide-number\nplaceholder), `images` (path + left\u002Ftop\u002Fwidth\u002Fheight in inches), `tables`\n(`rows` as list-of-lists), `shapes` (rectangle, rounded_rectangle, oval,\ndiamond, right_arrow, chevron, with `fill` hex + optional `text`),\n`charts` (bar, bar_h, line, pie with `categories` + `series`), and\n`notes` (speaker notes).\n\n### 2. Read a deck\n\n`pptx_read.py deck.pptx --outline` returns slide size, layout inventory,\nand per slide: layout name, all shape texts, table cells, image inventory\n(filename\u002Fext\u002Fbytes), chart categories\u002Fseries\u002Fvalues, and speaker notes.\nUse `--images DIR` to dump embedded pictures to files, then\n`vision_analyze` on any exported image if you need to see its content.\n\n### 3. Edit a deck\n\n`pptx_edit.py` combines operations in one pass; use `--output` to keep the\noriginal. Text replacement scans slide shapes, table cells, and notes.\nImage swap retargets the picture's relationship id so position and size\nare preserved. Slide removal drops the relationship and the `\u003Cp:sldId>`\nentry; reorder moves the `\u003Cp:sldId>` element within `\u003Cp:sldIdLst>`\n(python-pptx has no public API for either — the script does the XML-level\nwork). `--duplicate-slide N` appends an independent deep copy of slide N:\nshape XML plus image\u002Fmedia\u002Fhyperlink relationships are cloned and rIds\nremapped, so editing the copy never touches the original. Chart slides\nare refused (see Pitfalls). `--set-notes`\u002F`--append-notes` edit speaker\nnotes; `--set-background`, `--hyperlink`, `--enable-slide-number`, and\n`--set-footer` handle deck polish.\n\nChart updates take a JSON spec via `--chart-data`. Full replace:\n`{\"slide\": 0, \"chart\": 0, \"categories\": [...], \"series\": {...}}`. For\nsurgical edits, pass `\"ops\"` instead — a list of\n`{\"op\": \"update_series\", \"name\": ..., \"values\": [...]}`,\n`add_series`, `remove_series`, `rename_category` (`from`\u002F`to` or\n`index`), and `set_title`. python-pptx can only swap a chart's entire\ndataset (`replace_data`), so ops are implemented as read-existing →\nmodify → replace; the per-part UX is a wrapper, and any chart data not\nexpressible as categories + numeric series will be normalized by the\nround-trip.\n\n### 4. Build from a template\n\n`pptx_from_template.py` opens a brand .pptx, replaces every\n`{{token}}` from a values JSON across slides\u002Ftables\u002Fnotes, and can append\nnew slides that use the template's own layouts (by layout name or index)\nso they inherit the master's fonts and colors. Tip: to start from a\ntemplate with zero slides, delete existing ones afterward with\n`pptx_edit.py --remove-slide`.\n\n### 5. Visual verification\n\n`pptx_render.py deck.pptx --outdir .\u002Frender` converts the deck to PDF\nwith `soffice --headless` and splits it into one PNG per slide with\n`pdftoppm` (or `pdftocairo`). Output JSON lists the PNG paths — review\neach with `vision_analyze`. When either tool is missing the script exits\n0 with `{\"rendered\": false, \"missing\": [...]}` and guidance; fall back to\nthe JSON outline from `pptx_read.py`, which verifies content and\nstructure, just not visuals.\n\n## Converting to PDF\n\nIf LibreOffice is installed, export the finished deck to PDF directly:\n\n```bash\nsoffice --headless --convert-to pdf --outdir .\u002Fout deck.pptx\n```\n\nThe output lands at `.\u002Fout\u002Fdeck.pdf`. Fonts not installed on the host are\nsubstituted, so render-verify (Procedure step 5) before shipping the PDF.\nThere is no offline pure-Python .pptx→PDF path; if `soffice` is absent,\nsay so rather than approximating.\n\n## Pitfalls\n\n- **Run splitting**: PowerPoint fragments paragraph text into runs at\n  spell-check and edit boundaries. `--replace-text` first merges adjacent\n  runs whose formatting is identical, so matches split across such runs\n  are replaced with formatting fully preserved. Only when a match spans\n  *genuinely differently-formatted* runs is the paragraph rewritten with\n  the first run's formatting — verify those slides after replacement.\n- **Chart slides cannot be duplicated**: each chart relationship embeds a\n  separate XLSX workbook part; cloning that graph reliably is not\n  supported, so `--duplicate-slide` refuses chart slides cleanly instead\n  of corrupting the deck. Rebuild the chart on a new slide instead.\n  External-hyperlink and image\u002Fmedia rels are carried over; layout and\n  notes rels are recreated fresh.\n- **Chart ops are a wrapper**: python-pptx replaces the whole dataset;\n  `\"ops\"` round-trips existing plot data through `replace_data`, and\n  changing chart *type* is not possible.\n- **Reordering is XML-level**: python-pptx has no supported reorder API.\n  `--move-slide` manipulates `\u003Cp:sldIdLst>` directly; safe for ordinary\n  decks but re-read the deck afterward to confirm.\n- **Copying slides between decks is unsupported** — duplication works\n  only within one deck, where layouts and masters are shared.\n- Footer\u002Fslide-number enablement copies the placeholder from the slide's\n  layout; on layouts without those placeholders, `--set-footer` fails\n  with a clear message (add a textbox instead).\n- Hyperlinks apply to whole runs; `--hyperlink` links every run\n  containing the given text on that slide.\n- The default python-pptx template is 4:3; the create script sets 16:9\n  unless the spec says otherwise. Custom templates keep their own size.\n- Layout indexes vary by template. For brand templates, list layout names\n  first: `pptx_read.py template.pptx --outline` (`layouts_available`).\n- `slide.shapes.title` is None on blank layouts — the create script\n  handles this, but remember it when writing ad-hoc python-pptx code.\n- Always pass `encoding=\"utf-8\"` when writing spec files; tokens like\n  `{{city}}` may be filled with non-ASCII values.\n\n## Verification\n\n1. After any create\u002Fedit, run `pptx_read.py OUT.pptx --outline` and check\n   slide count, texts, tables, notes, and chart values match intent.\n2. `--images DIR` then file-size check confirms pictures embedded.\n3. Render every slide with `pptx_render.py deck.pptx --outdir .\u002Frender`\n   and review each PNG with `vision_analyze` — this catches overlapping\n   shapes, truncated text, and color problems the outline cannot. If the\n   render tools are missing, the script says so; rely on the outline.\n4. The bundled test suite is the full contract:\n   `python -m pytest tests\u002F -q` (requires python-pptx + pytest).\n",{"name":35,"author":36,"license":15,"version":37,"metadata":38,"platforms":51,"description":55},"powerpoint","Nous Research","1.1.0",{"hermes":39},{"tags":40,"category":46,"related_skills":47},[41,35,42,43,44,45],"pptx","presentations","slides","office","python-pptx","productivity",[48,49,50],"docx","xlsx","pdf",[52,53,54],"linux","macos","windows","Create, read, edit .pptx decks with python-pptx.","main","64e2fc9afa7bb3da1138eb73399144d0e7e73e9d","claude-plugin\u002Fskills\u002Flighting-setups",3,"https:\u002F\u002Fgithub.com\u002Fpedronaugusto\u002Fblender-weave","https:\u002F\u002Fgithub.com\u002Fpedronaugusto","2026-11-10 03:07:12",{"source":8,"skillName":35,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add pedronaugusto\u002Fblender-weave --skill powerpoint",{"tool":69,"command":70},"bunx","bunx skills add pedronaugusto\u002Fblender-weave --skill powerpoint",{"tool":72,"command":73},"pnpm","pnpm dlx skills add pedronaugusto\u002Fblender-weave --skill powerpoint","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpedronaugusto\u002Fblender-weave\u002Fblob\u002Fmain\u002Fclaude-plugin\u002Fskills\u002Flighting-setups\u002FSKILL.md",true,[77,82,88,92,96,100,104],{"path":78,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"LICENSE","许可证",1070,"https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002Fproductivity\u002Fpowerpoint\u002FLICENSE",{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},"scripts\u002Fpptx_create.py","SCRIPT","脚本",8579,"https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002Fproductivity\u002Fpowerpoint\u002Fscripts\u002Fpptx_create.py",{"path":89,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":90,"sourceHtmlUrl":91},"scripts\u002Fpptx_edit.py",17224,"https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002Fproductivity\u002Fpowerpoint\u002Fscripts\u002Fpptx_edit.py",{"path":93,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":94,"sourceHtmlUrl":95},"scripts\u002Fpptx_from_template.py",3431,"https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002Fproductivity\u002Fpowerpoint\u002Fscripts\u002Fpptx_from_template.py",{"path":97,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":98,"sourceHtmlUrl":99},"scripts\u002Fpptx_read.py",4761,"https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002Fproductivity\u002Fpowerpoint\u002Fscripts\u002Fpptx_read.py",{"path":101,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":102,"sourceHtmlUrl":103},"scripts\u002Fpptx_render.py",3536,"https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002Fproductivity\u002Fpowerpoint\u002Fscripts\u002Fpptx_render.py",{"path":105,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":106,"sourceHtmlUrl":107},"tests\u002Ftest_powerpoint_skill.py",19524,"https:\u002F\u002Fgithub.com\u002Fadnichols\u002Fai-configs\u002Fblob\u002Fmain\u002F_hermes\u002Fdefault\u002Fprofiles\u002Fwriting\u002Fskills\u002Fproductivity\u002Fpowerpoint\u002Ftests\u002Ftest_powerpoint_skill.py",[109,121,131,145,155,167],{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":30},"01M6HPY0J2SFKBYX5694JDTCC3","walkthrough","Plan and render a camera walkthrough animation","https:\u002F\u002Fgithub.com\u002Fpedronaugusto\u002Fblender-weave\u002Fblob\u002Fmain\u002Fclaude-plugin\u002Fskills\u002Fwalkthrough\u002FSKILL.md",[],[111,116,117,118,119,120],"Animation","plan","camera","render","true",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":127,"publishedAt":30},"01M6HPXY36AJ6S4M8A7VKEPQQY","fill","Analyze empty space and suggest items to fill the room","https:\u002F\u002Fgithub.com\u002Fpedronaugusto\u002Fblender-weave\u002Fblob\u002Fmain\u002Fclaude-plugin\u002Fskills\u002Fspace-fill\u002FSKILL.md",[],[123,128,129,120,130],"analyze","empty","space",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":30},"01M6HPXW8TVKQ6Y6EGKHGRTNY8","scene-check","Run Scene Doctor to diagnose and fix scene issues","https:\u002F\u002Fgithub.com\u002Fpedronaugusto\u002Fblender-weave\u002Fblob\u002Fmain\u002Fclaude-plugin\u002Fskills\u002Fscene-check\u002FSKILL.md",[],[138,139,140,141,142,143,144,120],"check","scene check","diagnose","run","doctor","issues","fix",{"skillNo":146,"name":119,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":30},"01M6HPXTKC3MG6CGG32C2BGBFT","Set up and execute a render of the current camera view","https:\u002F\u002Fgithub.com\u002Fpedronaugusto\u002Fblender-weave\u002Fblob\u002Fmain\u002Fclaude-plugin\u002Fskills\u002Frender-setup\u002FSKILL.md",[],[119,118,151,120,152,153,154],"execute","up","SET","view",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":30},"01M6HPXRYFPGMKBTPJFMKTXV6G","save","Quick save with snapshot and auto-generated filename","https:\u002F\u002Fgithub.com\u002Fpedronaugusto\u002Fblender-weave\u002Fblob\u002Fmain\u002Fclaude-plugin\u002Fskills\u002Fquick-save\u002FSKILL.md",[],[157,162,163,164,165,26,166,120],"generated","snapshot","auto","auto-generated","quick",{"skillNo":168,"name":169,"nameZh":6,"description":170,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":171,"categories":172,"keywords":173,"publishedAt":30},"01M6HPXK5MA2N0FQHEC97Y7157","perspicacity","Perspicacity scene perception DSL — structured 3D spatial awareness for AI. Reference for reading and reasoning about .picacia format output.","https:\u002F\u002Fgithub.com\u002Fpedronaugusto\u002Fblender-weave\u002Fblob\u002Fmain\u002Fclaude-plugin\u002Fskills\u002Fperspicacity\u002FSKILL.md",[],[169,174,175,176,177,178,179,180,181,182,183,184,28,185],"dsl","awareness","3D","format","reference","Spatial","structured","perception","output","about","reading","reasoning"]