Skip to content

Releases: hugohe3/ppt-master

v6.7.3

Choose a tag to compare

@hugohe3 hugohe3 released this 22 Oct 11:43

Patch release: Edit Native and native-object fixes that stop a round trip from failing or silently replacing content, plus a readable fallback for native formulas outside PowerPoint.

Edit Native PPTX

  • An explicit Morph pair whose endpoint sits on an otherwise unchanged page no longer crashes with KeyError. The page keeps its source bytes, and only the shape name the pair needs is patched (604ecde).
  • Moving an imported object that kept its source text body (for example Office Math that could not be rebuilt as a formula) restores that text body at the new position. Before, any move rebuilt the formulas as plain text. Edits that do change the text still rebuild it, and now warn when native math would become plain text (2e1658c).
  • Imported charts and block formulas rebuilt during a round trip keep their source shape id. Before, export stopped with "Edited slide removed source animation target(s)" (0db9d90, cd44568).

Native charts and formulas

  • A new or rebuilt chart no longer takes the same part name as a chart restored from the source package. Before, the later write silently replaced the earlier chart's data. Exports without such a collision are byte-identical (970d9cc).
  • Native formulas now include a fallback built from their SVG preview, so clients without Office Math support (LibreOffice, WPS) show the formula instead of nothing. PowerPoint keeps using the native math (dc7eab3).
  • PPTX import rebuilds PPT Master formulas whose color is a theme color or translucent, instead of turning them into plain text boxes (029201f).

Live preview editor

  • The preview canvas no longer stays blank with "SVG may be corrupted or missing the root <svg> element", and Save no longer writes ns0:-prefixed SVGs. This regression was only on main after v6.7.2. Thanks @ganeshmshetty (#323, #324).

Image to PPTX

  • The profile now defines how page-pixel geometry maps to the SVG canvas, so native text and shapes stay aligned with the base layers when the canvas differs from the source size (f2a20a0, discussion #272).

Installation and docs

  • pip install -r requirements.txt no longer fails with UnicodeDecodeError on Chinese Windows (GBK locale) (69634d6, discussion #321).
  • README and the positioning docs now name the optional services that send data off the machine: image generation, web image search, URL import and online narration (cc8b722, discussion #69).

v6.7.2

Choose a tag to compare

@hugohe3 hugohe3 released this 17 Oct 12:21

Patch release: fixes from an audit of the issue history. Most of them stop a tool from losing, overwriting or rewriting content while it reports success.

Installation and startup

  • Skill-only installations create projects in your working folder again (703aa72, #144). Since v6.3.0, project_manager.py init placed projects relative to the installed skill. For an npx skills or plugin installation, that meant .agents/projects/ or the plugin cache, where an update can replace them. Inside a repository checkout nothing changes.
  • On Windows, a python3 that never starts (the WindowsApps stub exits 9009 with no output) is no longer treated as an integrity-guard failure; the agent retries with python first (e1b5873, follow-up on #142).

Source conversion and import

  • PDF: removed four table rewrites that were written against one sample paper. They re-derived variable categories from hard-coded symbols, replaced headers, dropped rows and invented a correlation column. Extracted cells are now kept as extracted (3aa2ec6).
  • HTML: pages are decoded by BOM and their charset declaration instead of forced UTF-8, so a <meta charset="gbk"> page no longer comes out as replacement characters. A guessed encoding is reported (34d88c1).
  • Web: pages with the same title in one batch get Report.md, Report_2.md instead of overwriting each other (e847939). A raw .md URL whose code fence shows <body> stays Markdown instead of being reduced to the example (6a92c1f).
  • import-sources: .txt sources in GB18030 or other non-UTF-8 encodings are decoded instead of replaced (39b470f). Markdown with the same text but different companion images (<stem>_files/) is no longer treated as a duplicate and deleted (104bc3c).
  • PPTX import: b="true" / i="true" now import as bold and italic, as "1" already did (8bdf440). Page-type classification matches whole words, so "Qatar" or "Department" no longer reads as a Q&A or chapter page (c0ce242).

Live preview editor

  • Save All refuses to replay staged edits onto an SVG that changed after they were staged, keeping them staged with an error. Before, they landed on whichever element now sat at that position (05e627c).
  • User ids that start with _edit_ are kept, and dy=".5"-style numbers are parsed correctly when a line is moved (264bd66).

Export, finalize and checker

  • Proportional fonts such as Arial Unicode MS and Monotype Corsiva are no longer sized as monospace (c266856).
  • Icons and illustrations marked with single-quoted preserve-color or stroke='currentColor' keep their colors and style (05cf79c, 0cdf876).
  • The checker no longer fails a slide whose visible text reads class=â€Ķ, onload=â€Ķ or @import â€Ķ, or that carries a data-class attribute. Real class, event and CSS-import usage still fails (8f00128, 923a536).

Images, narration and video

  • Manifest images named like hero.v2.png no longer overwrite hero.png (e9676c5).
  • Image search ranks by whole words: required "Iran" no longer accepts "Tirana", and the transit penalty no longer hits "business" or "trail" (d4ac79d, b827c5c).
  • Page subtitles and notes follow numeric slide order past slide 9 and slide 99 (1036fd5). Narration keeps lines such as #1 revenue grew and skips only real Markdown headings (06008e8).

Docs

  • The FAQ no longer promises pixel-identical charts in Keynote, LibreOffice and WPS; Microsoft PowerPoint is the validation target (ac16c04).

v6.7.1

Choose a tag to compare

@hugohe3 hugohe3 released this 16 Oct 15:50

Patch release: fixes for work that the live preview, source conversion and source import could lose without a warning, plus a full pass over the UI strings in every language.

Live preview

  • Unapplied annotations and direct edits now survive a server stop (1fa3768, #319). Before, they lived only in server memory, and the idle timeout, Exit preview, --shutdown, a kill or a crash before Apply changes discarded them. Closing a laptop lid made this likely: the idle timer counted the suspend time, so the server exited on wake.
    • Every staging change is written to live_preview/draft.json before it is acknowledged. The next start restores it and the UI lists the restored slides; you still decide when to apply.
    • A slide whose SVG changed in the meantime is not replayed onto it. Its draft is kept as live_preview/draft_conflict_<timestamp>.json and the UI says so.
    • Exit preview now keeps the draft instead of discarding it. A failed draft write is reported in the UI.
    • Apply changes keeps a slide staged when an annotated element no longer exists, instead of dropping the annotation. SVGs are written atomically, and a submit that finds nothing pending on the server is reported instead of shown as saved.

Source conversion and import

  • Direct PDF/document/Excel/PowerPoint batches without -o no longer let same-stem inputs (budget.xlsx + budget.xlsm) overwrite each other's Markdown while reporting success (8d630ff, #317).
  • import-sources gives same-stem sources distinct archive stems, so the second one is converted and reaches the project (ca04346).
  • Notebook output images go to <output-stem>_files/, so notebooks converted side by side no longer overwrite each other's images (e4a4c08).

UI strings and prompts

  • Corrected the Simplified Chinese, Traditional Chinese and Japanese UI strings across the confirmation, spec review and live preview pages: meaning errors, stale strings, punctuation and consistent terms. Two stale English source strings were also fixed, and translation keys that nothing reads were dropped (5d613ea, ecb6269, bc3f51d, 5d806d2, df82a22, b684364).
  • Workflow triggers, templates and candidate keys now follow the repo language rule (a517095). The user docs no longer say the communication recommendation is written without reading any template content (667b032). The Chinese docs are resynced with their English sources (e0e6576, 0b898cd).
  • Thanks to @kevindesuyo for the whole UI-string and docs pass.

v6.7.0

Choose a tag to compare

@hugohe3 hugohe3 released this 08 Oct 02:01

Minor release: a browser review page for the design spec, Google's new Nano Banana 2.1 as the default Google image model, and fixes for content that source conversion and PPTX/SVG text round-trips used to lose without a warning.

Image generation

  • Google image generation now defaults to Nano Banana 2.1 (gemini-nano-banana-2.1, GA on 2026-10-06), on the Gemini, OpenRouter (google/gemini-nano-banana-2.1) and fal (google/nano-banana-2.1) backends. Google has deprecated gemini-3.1-flash-image, but has not announced a shutdown date. Nano Banana 2.1 does not offer 512px, so all three backends now reject 512px for it before sending a request. The wide ratios 1:4 4:1 1:8 8:1 still work (35508e3).
    • If your .env pins GEMINI_MODEL=gemini-3.1-flash-image (or the OpenRouter/fal equivalent), that setting still wins over the new default. Update or remove the line to switch.
    • Removed the IDs gemini-3.1-flash-image-preview and gemini-2.5-flash-image-preview; Google has shut both models down.
  • OpenAI: OPENAI_BACKGROUND=transparent is now accepted for GPT Image models, including gpt-image-2 (in preview at OpenAI), and is refused only together with JPEG output. gpt-image-2.5-sunburst / gpt-image-2.5-flare and their snapshots accept OPENAI_QUALITY=xhigh|max. gpt-image-1-mini accepts input fidelity low only. The default stays gpt-image-2 (3f98568).
  • Backend fixes:
    • Qwen 2K 2:3 / 3:2 used to produce 3:4 / 4:3 images.
    • A Volcengine Ark base URL ending in /api/v3 no longer gets /api/v1 appended.
    • Replicate now rejects 21:9, which flux-1.1-pro does not offer, before sending the request (06d8f0a).
  • image_search halves originals above Pillow's decompression-warning size (481e057). slice_images handles three more cases (964d920, fd20665, adbfdf4):
    • a ground that is uneven but key-coloured;
    • edges and shadows blended with the key colour;
    • despill on a ground measured close to the key colour.

Design spec review

  • New browser review page for design_spec.md: one page per section, Part and slide. You can edit one block's Markdown directly. The edit is applied as an exact byte-range replacement with a hash precondition, and its schema is checked before it is written. You can also leave per-block or global comments, which go in a separate sidecar file and never into the spec. check_spec_annotations.py hands both kinds of feedback to the agent (aec3202, 61ad7ae).
  • With refine_spec on, a run that confirmed on the page now also reviews the spec on the page; runs confirmed in chat keep reviewing in chat. Approval still happens in chat. Resume returns to Refine Spec if the spec changed after the lock (866efd8).

Source conversion

  • DOCX, PPTX, Excel and web converters no longer drop content without a warning. Affected content included nested tables, content controls, endnotes and links inside tables, OMML separators, PPTX field text and numbering continuation, Excel hidden sheets, merged cells and number formats, and more (13ac724, 2d72da6).
  • pdf_to_md keeps body text that repeats a running header or footer, and keeps numeric or labelled paragraphs that sit between tables sharing a header (51c2979, 4eb7b3d). Typst text survives when pandoc cannot evaluate it (176235a).

PPTX ↔ SVG text

  • Text baselines now come from one shared font-metric model in both directions, replacing fixed font-size estimates (3d1b7dc, #301).
  • Imported text that overflows its frame keeps every line, following DrawingML's default overflow, and stays vertically anchored. Explicit clip and ellipsis are still honoured (c9a8258, d542475).

UI and tooling

  • Spec review, confirmation and live preview UIs:
    • all detect and store the UI language the same way;
    • switching language keeps typed annotations;
    • zh-TW uses full-width separators.
      Thanks to @kevindesuyo (#305, #306, #307).
  • Detached servers keep ANSI colour codes out of their logs (1d76e32). The bundled comparison gallery and logos are smaller (6a9ee2a).

Sponsors

  • Added the international Kimi Code link next to the domestic one (#296), and removed a sponsor whose sponsorship term ended (680de11).

v6.6.0

Choose a tag to compare

@hugohe3 hugohe3 released this 19 Sep 05:06

Minor release from three days of end-to-end runs since v6.5.0: every route was driven through real decks — same-deck hyperlink navigation, Beautify under Quick, Edit Native with pages dropped and with a foreign PPTX used as a template, Create Brand / Layout / Style followed by Generate, four of the bundled Layout templates, the visual-review stage, EPUB and RST sources, a bilingual deck, and decks in Chinese, English, German, Spanish, Portuguese and Vietnamese. Every change below is backed by a reproduced defect or a documented contract gap; no route was added or removed.

Bundled Layout templates

  • editorial_bleed fades now protect their own text slots. The six text-over-image gradients reached only 0.12–0.35 alpha under the title, caption and body slots they exist to protect (the first visual-review run measured 1.2–2.5:1 contrast on a deck that moved no slot). Each gains a middle stop that holds at least 0.60 through its slot and falls away only past it (012a54f).
  • presentation_core, presentation_core_43 and report_core table and chart prototypes pass native parity. Each library shipped eight "blocks --native-charts-and-tables export" warnings that a deck copying the prototype metadata inherited; the payloads now carry the row heights, header alignment, band-row fills and bold-cell colour their fallbacks draw (7599c78).
  • A slot's bounds are capacity, not a whitespace quota: the structure interface now says what to do when content under-fills a slot, and that a Morph pair on a structured page is a Slide-local group decided before the first page — stated for template authors, planners and executors alike (b526e82, b431e1b, e1ab666, 9ce704c).

Edit Native PPTX

  • Imported text matches what PowerPoint renders. a:normAutofit fontScale / lnSpcReduction now reach the emitted font size and line height — a 60 pt box shrunk to 25 % used to import at 80 px and fail the frame gate on any edit — and a run with no typeface anywhere in its chain takes the theme's minor Latin / East Asian pair instead of a bare sans-serif, which exported every edited run as Segoe UI (f4ab81f).
  • The round-trip checker admits an edit that reaches no further than the source text of its own slot, and refuses absolute-y rows inside a semantic shape, which previously passed the gate and then crashed export (f4ab81f).
  • Dropping pages from a deck with same-deck links: export lists every slide whose jumps leave the page plan in one pass instead of one per run, prints its receipt only after the package is written, and the workflow documents how to retarget a jump (9290149, 658ebf2).
  • New elements may be native-marked charts and tables; the boundary section now says so (29770a2).

Export and checker

  • --kiosk writes a looping, self-running kiosk show and names the export accordingly (067cb13, 9290149).
  • Hyperlinks: the checker compares each page's anchors with its design_spec §IX Hyperlinks line; a bare <a> around one top-level group is transparent for animation and grouping (b7d0114, 48238f9, d4c59f1).
  • Icon references keep their fill local under compact authoring — embed_icons reads no inherited paint, so the canonical-authoring advisory contradicted the executor's hard rule (aa5cf55).
  • A stroked rect on a table's outer bounds counts as its frame in the border-topology check; the typed chart/table slot tip now says the standard export fails and names the Slide-local alternative (7599c78).
  • Structure-contract errors on a template page now say that fills, strokes and gradients may be repainted — only ids, order, geometry and data-pptx-* metadata are contract — and a text overflow inside a Layout slot no longer advises expanding the slot's bounds (4a28573, ca15a6a).
  • --template-mode reports the roster contract beside a Brand or Style spec in a shared workspace (aa5cf55); beautify_inventory --verify checks every frozen source string against an exported deck (7e0ea2b); pptx_intake reports grouped shapes in slide space (9e0c246).

Text measurement

  • The bundled advance table grows from five families to ten: Cambria, Trebuchet MS, Garamond and Tahoma join Arial, Times New Roman, Georgia, Verdana and Calibri; Segoe UI is measured from Selawik, Microsoft's OFL metric-compatible replacement (d874fb1, 3214e29).
  • Accented letters outside the table advance like their base letter. Vietnamese, Turkish, Polish and Czech precomposed letters used to fall into the 0.55 em default tier — áŧ” 27 % narrow, áŧŠ 83 % wide (c050b1f).
  • Unicode fixed-width spaces are sized by definition (70705eb).

Sources, images and tools

  • web_to_md validates the host the client actually connects to and pins connections to the validated addresses (3b45af2).
  • slice_images --strict-alpha retries once with the measured tolerance when every finding is key noise (d475c0a); several opaque photos for a multi-cell layout may share one generated sheet sliced by grid.
  • import-sources removes a moved duplicate instead of announcing a move that never happened (7599c78); animation_config refuses a file path where a project directory is expected (df118da); visual_review.py --pages takes comma lists (012a54f); image_search keeps the caller's provider pin (1b57b01).

Workflow and prompts

  • Visual review may deepen a fade that already sits under the text, defers a soft hit that recurs deck-wide to one decision by the aggregating agent, and names the parallel-subagent host form (b431e1b).
  • Create Template: standard reads enough Slides to settle direction while fidelity reads all; a Layout carries one neutral Latin face; a brand manual's usage rules sit under the section they govern; a long PDF reference is sampled by page situation (9ce704c, 5dd4c34).
  • Quick: template prototypes and the first-page deck language are read from the roster; a book-length source is read by heading index; the installed spec is the re-readable truth for a lockless run (05ad626, adb9faf, e1ab666, 5dd4c34).
  • Number, quotation and unit conventions follow each content language; narration reads bilingual notes twice; delegation skips the confirmation page, not the three solution intents (7c4543b, e2aff57, b431e1b).

Examples

Five decks joined the examples site in this cycle, among them the first on the editorial_bleed and story_vertical Layout templates, the first from an EPUB source, and the first with native same-deck hyperlinks.

v6.5.0

Choose a tag to compare

@hugohe3 hugohe3 released this 16 Sep 12:20

Minor release from two focused rounds since v6.4.0: the Create Template / use-template flow was audited and reworked, and the Edit Native PPTX route was exercised on real government and university decks (multi-master, source animations, native charts, SmartArt, narration, revision rounds) and fixed wherever it broke. Every change is backed by a reproduced defect or a documented contract gap; no route was added or removed.

Edit Native PPTX (round-trip import → edit → export)

  • Decks that could not be exported at all now export: a built-in layout no slide uses with a collapsed <a:ext cx="0" cy="0"/> placeholder no longer fails the native structure contract, and an untouched page holding a full-canvas picture no longer loses that picture to background promotion when narration forces a rebuild (6509129).
  • Motion overlays diff against the import baseline field by field: a sidecar row that omits transition keeps the source transition even though the importer writes defaults.transition: none; animation.effect: none really removes the source timing; -t and effect-only rows keep the source advClick / advTm; a user-edited default is a deck-wide request (a7cb776).
  • Narration injects into a slide whose timing tree is a bare tmRoot, blocks on natively preserved click animations with the output stem, source slide and shape ids named, replaces its own earlier audio instead of stacking a second autoplay track, matches imported audio to output pages through the manifest, and reuses its media name across re-recordings (a7cb776, b560f85).
  • Fidelity: same-deck links on rebuilt objects keep their source destination through text edits, page plans and adoption; Master/Layout refs refuse edits instead of vanishing while the original keeps rendering; ancestor transform / opacity / inherited style join the source-ref diff so a moved wrapper actually moves; a paint-only edit keeps the native text body (auto-numbering, autofit, fields, language); custom-show selections and actions close after a page plan; SmartArt, OLE and other unsupported graphic frames carry the atomic proxy marker the route always promised (57f7623).
  • Notes: a new note for one page no longer overwrites another page's notes part; round-trip workspaces match notes by exact stem and print the real count; --no-notes removes every notes part, master, relationship and override; imports write notes/<stem>.md only (73bc51a, b560f85).
  • Packages: replaced chart parts, workbooks and slide relationships the slide XML never used are pruned on edited round-trip pages and on every generated slide (structured export left the promoted master background registered on each slide); the delivery check counts slides, notes, masters and layouts by content type, reports dangling custom-show references as errors and unreferenced slide relationships as advisories (57f7623).
  • Quality gate: svg_quality_checker.py --roundtrip --json writes to validation/ and shares its fingerprint with the exporter, so a round-trip export can report quality_gate=passed; the checker measures imported lines / paragraphs text row by row, stops re-estimating source text that only moved vertically, enforces the exporter's one-text semantic-shape contract early, and warns when an edited page rewrites a table the importer could not carry natively (73bc51a, 6509129).
  • Route documentation states the identity boundary, both imported text models, what skipping --native-charts-and-tables really ships, the notes consumer contract, the spid → shape-<id> mapping, retention of every Master/Layout under a page plan, --primary-language, and a revision-round paragraph (52a2801, 5581c85).

Create Template and template consumption

  • Installation is staged with rollback and a machine receipt (template_install.json); the Confirm UI freezes selected-root snapshots, accepts several explicit roots, binds stages by content and verifies the installation itself — the handoff sidecar and its two commands are gone (6de7939, f58f846).
  • Type A mirror is a pure tool path: zero-edit import → materialize → checker → preview with a factual spec skeleton; the Type B promise is withdrawn (f58f846).
  • Template mode checks carrier baselines against slot bounds, mirror text targets, and offers an advisory --slot-capacity-report; translucent full-canvas rects are not backgrounds; CJK literal font names never occupy the Latin slot; layout-fixed atoms leave the sparse display-size quota; three bundled deck templates gained taller chapter-number slots (be80892, f58f846).
  • Structured export keeps custom placeholder faces, re-skins master backgrounds from public pages, compiles typed chart/table slots natively in previews, rejects placeholder slots as Morph endpoints at validate, and compiles zero-padded page numbers to slide-number fields (6de7939, 6e3ce9c).
  • Prompts: Stage 1 keeps the goal rather than blacking out template facts; Create Template gains a prototype review round; slot fit is checked before the typography lock; Quick names the typed-slot export flag; import-sources --no-image-propagation keeps reference bitmaps out of images/ (6627d92, f58f846, 6e3ce9c).

Tooling

  • notes_to_audio.py accepts --rate -5% (and --pitch / --volume, now passed to edge-tts) with a space or = (73bc51a).
  • Test subprocess output decodes as UTF-8 regardless of the parent locale; the first svg_output page is closed deterministically when its root language is read (7879bbc, c6ae489).
  • .env.example documents sponsor relay shortcuts (b44cdfa).

Install

Load skills/ppt-master/ as a skill (the attached ppt-master-skill-v6.5.0.zip contains only that directory) or install the plugin from the repository's marketplace.

v6.4.0

Choose a tag to compare

@hugohe3 hugohe3 released this 12 Sep 15:22

Minor release collecting a week of fixes found by running the pipeline end to end across languages, input types, deck lengths, and a revision round on a delivered deck. Every change is backed by a reproduced defect; no route, gate, or command was added or removed.

Converter (source_to_md.py)

  • PDF tables with partial ruling keep the columns drawn outside the ruled box (059119a); spreadsheet notes above the header become a quote instead of a phantom row; a scanned PDF and an out-of-order Arabic text layer are warned about (6c372a2, b3073f8).
  • Web fetch keeps the declared charset under a lossy decode and warns when only a sliver of the page body was extracted (95e3c41); web tables keep their links and land on a GFM grid (17d953a, 0ae80b1); document URLs route to their converter and honour --no-images and meta refresh (0b593d6, 25a9984).
  • DOCX charts, table footnotes, and absolute chart targets survive conversion (22da436, 4bbf7b7); PPTX read-back keeps soft line breaks (c71d9e7).
  • Safety: every redirect hop is validated before it is requested, and CGNAT and multicast targets are refused (4bbf7b7).
  • -o on a single input names the Markdown file and says so; --json keeps stdout to JSON.

Text measurement and multilingual decks

  • Width calibration runs per planned script (Thai, Devanagari, Arabic, â€Ķ) and at bold weight; Indic vowel signs advance the estimator; wrapping keeps words whole in every space-delimited script and breaks Korean between words (8900e87, e64a2b3, 88fb822, 0ae80b1).
  • Indic, Thai, Arabic, and Japanese faces are on the PPT-safe list; Japanese decks get EA faces and kinsoku; right-to-left decks get RTL defaults; explicit BCP-47 scripts pick the theme script slot (0609875, 5771f4f).
  • Latin runs inside a non-Latin deck proof as English (f76d1ec). Quick decks declare their language on the page root and the export derives theme fonts from the pages (0b06d19).

Native charts and tables

  • Table parity compares runs by effective style and lets explicit run colour and weight override the cell default (451c681, aee33e5); parity reads inherited text-anchor and tspan colour (5771f4f).
  • series[].line_style is rejected with a clear error and passes only inside a combo; Cambria Math is accepted; JSON CDATA survives compaction; classic axes are refused on ChartEx charts; data-label points follow their show flags (4a7512e, 83d8d00, 25a9984).
  • Fallback stamping reports a malformed page instead of skipping the valid ones; preset atoms keep their paint through style compaction (7acddfb, 6881d37).

Export and motion

  • Morph candidates are planned and authored whether or not animation is enabled (1fb122b); exported objects are named after their SVG id (a849c49); structured decks animate slot groups and re-skin master atoms (529403b).
  • MiniMax word timings that share one original-text span merge into one subtitle; written-out numbers stay whole (96742ff, 7086c45).

Quality gate

  • The final gate compares the design_spec §IX roster with svg_output/, so a page dropped or left un-planned during a revision no longer passes silently (191f462).
  • The carrier receipt counts pages whose §IX Relationships line names a carried relation; the unresolved-geometry warning names the tspan rule; text picture fills count as image placements (95e3c41, ed17157).

Workflow

  • A delivered project's revision has a named entry: routing.md sends it to a Revision Round section in generate-pptx.md (Default) or a revision note in quick-generate.md (Quick), covering which layer owns each kind of change, what a roster change renumbers, and which commands rerun (77c2745, 4d55172).
  • User-supplied images with licence terms register in image_sources.json so their credits are bound at the gate; research fetches pass --no-images (8e5e30a).
  • update_spec.py docs state what a colour change still edits by hand and when to re-stamp fallbacks.

Preview

Install

The ppt-master-skill-v6.4.0.zip asset contains only skills/ppt-master/ for agents that load the skill directory directly.

v6.3.2

Choose a tag to compare

@hugohe3 hugohe3 released this 10 Sep 03:20

Patch release completing the security follow-ups from the v6.3.1 report. Upgrading is recommended for anyone who runs the live preview or Confirm UI, or converts web pages with web_to_md.py.

Security

All five items were reported by Zick Sun as follow-ups to the v6.3.1 fixes and verified before shipping.

  • Preview sanitizer hardening (2784f7a). sanitizeSvg() now keeps only an explicit allowlist of SVG element names in the SVG namespace, closing two residual gaps: null-namespace elements slipped through a short-circuit, and SVG-namespaced elements named like HTML breakout tags (div, iframe) became live HTML after innerHTML. Tab, CR, LF, and leading control characters are stripped from href values before the javascript: / vbscript: / data: check, matching what the browser URL parser does. Both gaps were already blocked by the Content-Security-Policy shipped in v6.3.1; that header remains a load-bearing control.
  • DNS rebinding guard on both local servers (2784f7a). The live preview and Confirm UI servers bind 127.0.0.1 but accepted any Host or Origin. Requests now get 403 unless Host is a loopback name and, when present, Origin is too.
  • web_to_md.py verifies TLS by default (31a20f2). Certificate verification was disabled at every call site. It is now on; --insecure turns it off with a warning for self-signed development hosts.
  • web_to_md.py refuses non-public fetch targets (31a20f2). Redirects were followed with no validation, so a page that 302s to a link-local metadata endpoint or private address was fetched and saved. Every requested and final URL, for pages and images, must be http(s) and resolve only to public addresses. --allow-private-hosts opts back in for intranet or localhost pages you chose deliberately.

Other changes since v6.3.1

  • Scripts: text width headroom applied per script segment with bounded CJK clause breaks (64b6583); slice_images names edge-wide key noise (ac93240).
  • Workflow: Step 6 checkpoint aligned with the P05 early gate (3ad8052).
  • Docs: PyMuPDF AGPL-3.0 license and PDF-only scope disclosed (b41ec1d); prompt audit manifest brought to zero findings.

Install

The ppt-master-skill-v6.3.2.zip asset contains only skills/ppt-master/ for agents that load the skill directory directly.

v6.3.1

Choose a tag to compare

@hugohe3 hugohe3 released this 09 Sep 04:40

Patch release. Upgrading is recommended for anyone who opens the live preview (svg_editor/server.py) on projects that contain SVG from third-party sources.

Security

Two issues were reported privately by Zick Sun and fixed in 514596e. Thanks for the clear, verified report. Both require a malicious SVG to already be inside a project directory (for example from a third-party template pack, or a poisoned source document converted by the pipeline). Neither allows reading files outside the project; both servers keep binding to 127.0.0.1 only.

  • Live preview sanitizer bypass (mXSS). sanitizeSvg() in the preview page compared element and attribute names case-sensitively on an XML parse, then inserted the result through innerHTML, which lowercases names. Uppercase ONERROR=, <SCRIPT>, and XLINK:HREF="javascript:" therefore survived the filter. Comparisons are now case-insensitive, elements outside the SVG/XLink namespaces are dropped, vbscript: is rejected alongside javascript: and data:, and a malformed SVG now shows an error instead of injecting the parser error document. The preview page also gains a Content-Security-Policy restricting scripts to same-origin files.
  • Icon placeholder attribute injection. embed_icons.py interpolated fill, stroke, stroke-width, and transform from <use data-icon> placeholders into generated markup without escaping. A single-quoted value containing a bare " could inject a sibling attribute that the CLI then wrote to disk. The four attributes are now validated against strict grammars and every interpolated value is escaped. Legal values, including the matrix() transforms written back by the live editor, are unchanged; a regression run over an existing 50-page project produced byte-identical output.

Other changes since v6.3.0

  • Templates: Z-CARE Rescue brand and duty-manual style.
  • Video: keep the space between merged subtitle clauses (#283, thanks @MaxFreedomPollard).
  • Scripts: slice_images.py keeps opaque key-hue foreground intact during pure-key despill.
  • README: star history chart restored, trending badge added.

Install

The ppt-master-skill-v6.3.1.zip asset contains only skills/ppt-master/ for agents that load the skill directory directly.

v6.3.0

Choose a tag to compare

@hugohe3 hugohe3 released this 05 Sep 15:54

Important

This release is about fidelity and evidence. Native charts and tables now follow the drawn SVG item by item, Latin text is measured from real glyph advances instead of class averages, templates install with one command, and the examples library grew to 33 decks that cover every visual style, mode, and canvas plus the first spreadsheet-, PDF-, and Style-template-driven decks. Create Template and Edit Native PPTX remain paused (bug fixes only).

Converter

  • Native charts mirror the fallback drawing. Bar order, point markers and per-point colours, area fills without strokes, clustered gaps and overlap, and where a line starts inside the plot are all read from the authored SVG; sparse cell caches import as gaps; companion text is grouped with its chart so one animation moves the whole unit and sits on the fallback baseline. The chart frame grows past the plot so PowerPoint keeps the manual vertical layout instead of collapsing it.
  • Native tables export unfilled cells as noFill, carry defaults.run colour into plain-text cells, let paragraphs cells inherit run defaults, and honour authored row heights over padding.
  • Text width from real glyphs. Arial, Times New Roman, Georgia, Verdana, and Calibri (regular, bold, italic, bold-italic) are measured from a bundled per-glyph advance table (font_advances.json); monospaced faces measure as characters × fixed advance; wide faces (Arial Black) keep their factor. A mixed-case Arial line can now fill about 94% of its text frame before the wrap headroom applies, up from 85%, and the checker and the exporter agree on the same number on every machine.
  • Export correctness fixes: hidden SVG elements and hidden clip shapes stay hidden, hidden groups keep their animation target, single-child group rotation is preserved, inline tspan dx is carried, root and native-gradient opacity apply, out-of-range shape frames and incomplete pattern fills are rejected instead of producing a file PowerPoint repairs, zero-width strokes export as no line, camera MPO JPEGs keep their primary frame, and image tools honour EXIF orientation.

Source conversion

  • Excel values keep full precision, source encodings are detected, inline spacing and absolute links survive web pages, HTML comments are dropped, raw Markdown and plain-text URLs are saved verbatim, pdf_to_md keeps line-leading decimals, --no-images works for web pages, an extension-less -o becomes <name>.md, batch conversion never overwrites an input, and import-sources copies another project's files instead of moving them.
  • The source converter's --help no longer needs optional dependencies installed (#282).

Templates

  • apply_template.py installs selected Brand / Style / Layout / Deck workspaces into a project per the apply-template-workspace runbook: validation, library/explicit provenance, Layout over Deck, roster and asset copy, idempotent re-runs, and a §5.3 receipt.
  • mbb-consulting, a new Style for strategy documents at document density — numbered exhibits with unit lines, a key-message column closing in an implication panel, five to seven modules per page, fixed page chrome, size anchors, fallback colours and typography — distilled from the EV market-priorities example. consulting-decision keeps its restrained method-first defaults.

Checker and authoring tools

  • Chart/table parity findings that would break --native-charts-and-tables are tagged as export-blocking; parity honours number_format, exact ticks, style.body_text for first columns, the centred header default, and names the multi-column rect behind a whole-column fill.
  • text_measure.py calibrate prints CAPS and DIGITS rates, an outline column, and merges --role; the width check reads inline hyperlink runs; validate resolves the real project directory; init resolves the projects root from the skill and checks the page count against the roster.
  • Animation order: unlisted groups follow the nearest listed order instead of their SVG index; static-role chrome animates when the sidecar names it, only structural layers and the slide background stay fixed; list-groups names chrome ids.
  • Slice diagnostics tell drift from overflow, keep the pure key, and flag backing panels; image search pages through a saved candidate pool; rotate_images reports failures.
  • A Tencent Cloud TokenHub image backend (tencent, aliases tokenhub / hunyuan) joins the image generators (#279).

Prompts and rules

  • Animation guidance: chrome is static by default and animates per page when named; Morph endpoints are groups fixed at first draw, continuity carriers are the default Morph; entrance order follows the reading path; illustration roles decide what moves.
  • Text and layout guidance: bounds top and bottom edges are spelled out, role groups still declare bounds, the all-tspan first line carries inline emphasis, digits use the DIGITS rate, calibration rates are sample averages with a 5% margin, and repeated writing forms are treated as method-level at the early gate.
  • Native data: data_labels type support, native objects never Morph-pair, row_heights includes the header row, borders.style form, defaults.cell, and the full chrome token list are documented where the exporter reads them.
  • docs/rules/code-style.md §11 now allows unit tests under skills/ppt-master/scripts/tests/ on stated conditions (stdlib unittest, scripts only, in-test fixtures, no CI); the suite has 212 tests.

Examples

The examples site now holds 33 decks (471 pages), with the first decks driven by a spreadsheet source (Apple FY2025 operating review from XLSX + CSV), by a PDF source (the ResearchStudio-Reel paper reading, English, academic-research Style), and by bundled Style templates (Cloudflare outage postmortem, uv product launch, EV market priorities on mbb-consulting), alongside new photo-, data-, and illustration-led decks (Apollo photo essay, China 2025 economy briefing, pixel-art breakfast atlas, solar-terms long-form and story, tea A4 handout, heritage-goods moments grid, brutalist field guide, WebGPU Quick, banner and header sets). Six May-era examples were migrated to the current checker without regenerating them.

Community

  • #278 (@WodenJay): wrapped Python daemon processes are verified on startup.
  • #282 (@QiuLsG): source converter help stays dependency-free.
  • #279: Tencent Cloud TokenHub backend.

Assets: ppt-master-skill-v6.3.0.zip is the skill-only tree for loading skills/ppt-master/ into any agent tool; the source archive carries the full repository.