diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index c93063bb..14280bd5 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -96,8 +96,8 @@ "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", "adapter": "claude-skill", - "commit": "68c690bbe2e170bca657c2dffd47434056cfabcd", - "syncedAt": "2026-07-24T06:18:20Z" + "commit": "1912f0112c711e7b46d893a461648c4cde437314", + "syncedAt": "2026-07-24T16:00:00Z" }, { "id": "next-skills", @@ -105,8 +105,8 @@ "repo": "https://github.com/vercel/next.js.git", "ref": "canary", "adapter": "skill-collection", - "commit": "29b3966370420894de50c3c105397985fb366140", - "syncedAt": "2026-07-24T06:18:20Z" + "commit": "6fd889b922fc0aaeaa7a6b63fce5450e20d2df99", + "syncedAt": "2026-07-24T16:00:00Z" } ] } diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index 3f43be3d..d728fe27 100644 --- a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json +++ b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json @@ -3,5 +3,5 @@ "name": "playwright浏览器自动化操作", "version": "20260605", "keySource": "none", - "syncedAt": "2026-07-24T06:20:34Z" + "syncedAt": "2026-07-24T16:02:23Z" } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index 3222b3e9..5690518a 100644 --- a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "next-skills", "repo": "https://github.com/vercel/next.js.git", "ref": "canary", - "commit": "29b3966370420894de50c3c105397985fb366140", + "commit": "6fd889b922fc0aaeaa7a6b63fce5450e20d2df99", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-07-24T06:18:20Z" + "syncedAt": "2026-07-24T16:00:00Z" } diff --git a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json index 9c23573d..e84ac2e0 100644 --- a/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/ppt-master/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "ppt-master", "repo": "https://github.com/hugohe3/ppt-master.git", "ref": "main", - "commit": "68c690bbe2e170bca657c2dffd47434056cfabcd", + "commit": "1912f0112c711e7b46d893a461648c4cde437314", "adapter": "claude-skill", "sourcePath": "skills/ppt-master", - "syncedAt": "2026-07-24T06:18:20Z" + "syncedAt": "2026-07-24T16:00:00Z" } diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/animations.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/animations.md index 3d53820e..6dc258e7 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/animations.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/animations.md @@ -17,12 +17,22 @@ To regenerate a deck with different settings, rerun `svg_to_pptx.py` against the ## 2. Custom Object-Level Animation -Per-element animation is off by default. To enable it deck-wide, pass `-a auto` at export (no config needed). When a deck instead needs specific object timing — for example title first, chart second, annotation last — use the optional `animations.json` sidecar. The SVG remains static visual source; the sidecar only controls PPTX export behavior. +Per-element animation is off by default. To enable it deck-wide, pass `-a auto` at export (no config needed). When a deck instead needs specific object timing — for example title first, chart second, annotation last — use the optional `animations.json` sidecar. The SVG remains the visual source; the custom stage may rewrite its grouping hierarchy, ids, and bounds to create better semantic anchors without changing visible output, while the sidecar controls PPTX animation behavior. Run the [`customize-animations`](../workflows/stages/customize-animations.md) post-processing stage when the user asks to tune animation order, effects, timing, or object-level reveals. +**Hard rule — semantic anchors before sidecar**: for custom object-level +animation, do not scaffold or choreograph directly from the SVG's pre-existing +`` list. First derive reveal units from page meaning and narration, audit +every page, and rewrite coarse or fragmented ordinary Slide-local groups +without changing visible output. Only the post-regroup top-level ids are valid +custom-animation anchors. + ```bash -# Build an editable scaffold from real top-level anchors +# Inspect the real anchors after the semantic regrouping pass +python3 skills/ppt-master/scripts/animation_config.py list-groups + +# Build an editable scaffold from the post-regroup anchors when useful python3 skills/ppt-master/scripts/animation_config.py scaffold # Validate references before export @@ -132,9 +142,9 @@ python3 skills/ppt-master/scripts/svg_to_pptx.py --animation mixed \ python3 skills/ppt-master/scripts/svg_to_pptx.py -a auto --animation-trigger with-previous ``` -22 single effects: `appear`, `fade`, `fly`, `cut`, `zoom`, `wipe`, `split`, `blinds`, `checkerboard`, `dissolve`, `random_bars`, `peek`, `wheel`, `box`, `circle`, `diamond`, `plus`, `strips`, `wedge`, `stretch`, `expand`, `swivel`. Plus three auto-vary modes: +29 single effects: `appear`, `fade`, `fly`, `fly_left`, `fly_right`, `fly_top`, `cut`, `zoom`, `wipe`, `wipe_left`, `wipe_right`, `wipe_up`, `wipe_down`, `split`, `blinds`, `checkerboard`, `dissolve`, `random_bars`, `peek`, `wheel`, `box`, `circle`, `diamond`, `plus`, `strips`, `wedge`, `stretch`, `expand`, `swivel`. Plus three auto-vary modes: -These names preserve the established filter / `presetID` / `presetSubtype` tuples documented in [`pptx-animations.md`](../scripts/docs/pptx-animations.md#3-compatibility-contract). `cut` is a legacy public key; compatibility promises its existing tuple, not a semantic interpretation inferred from an external preset-id table. +These names preserve the established filter / `presetID` / `presetSubtype` tuples documented in [`pptx-animations.md`](../scripts/docs/pptx-animations.md#3-compatibility-contract). `fly` remains the bottom-up variant. `wipe` preserves its historical tuple; use `wipe_left`, `wipe_right`, `wipe_up`, or `wipe_down` when motion should follow the layout explicitly. `cut` is a legacy public key; compatibility promises its existing tuple, not a semantic interpretation inferred from an external preset-id table. - `auto` (recommended when enabling) — map effect from the group's SVG id. Information-dense elements get a single stable effect: `chart` / `table` / `legend` / `timeline` / `track` → `wipe`; `card-*` / `pillar-*` / `item-*` / `step-*` / `stage-*` / `tier-*` / `principle-*` → `fly`; `title` / `chapter-*` / `section-*` / `cover-*` / `tagline` / `subtitle` → `fade`; `takeaway` / `callout` / `quote` / `source` / `conclusion` / `note` → `fade`. Image-like ids `hero` / `figure-*` / `image` / `img-*` / `kpi` instead cycle a richer visual pool (`zoom` / `dissolve` / `circle` / `box` / `diamond` / `wheel`) so multiple images vary across the deck. Unmatched ids cycle through `fade` / `wipe` / `fly` / `zoom`. - `mixed` (legacy) — deterministic. The first animated group on each slide uses `fade`; later groups cycle through a 16-effect pool (`blinds` / `checkerboard` / `dissolve` / `fly` / `cut` / `random_bars` / `box` / `split` / `strips` / `wedge` / `wheel` / `wipe` / `expand` / `fade` / `swivel` / `zoom`) across the deck. Kept for backward compatibility. @@ -159,7 +169,14 @@ Flags: Per-element animations are anchored on **top-level `` content groups** in the SVG (e.g. ``, ``). IDs must be unique within the page. One group produces one animation-pane entrance row; whether that row needs a click depends on the selected Start mode. Nested implementation groups may remain anonymous because the sidecar does not target them. -Use one content group per logical page unit. This is also the granularity PowerPoint uses for group-select / group-move, so semantic grouping improves editing ergonomics regardless of animation; do not split or merge units to hit a target count. +**Hard rule — existing groups are not custom-animation intent**: the +pre-existing SVG hierarchy is implementation evidence, not an authoritative +reveal plan. During the custom-animation stage, derive one group per logical +page unit from claims, comparisons, sequence, causality, and narration beats; +split coarse wrappers and merge fragmented atoms when needed, then use +`list-groups` only after that rewrite. This is also the granularity PowerPoint +uses for group-select / group-move. Do not split or merge units to hit a target +count. **Chrome groups skip the cascade automatically.** Explicit SVG role and placeholder semantics are authoritative. A group with `data-pptx-layer` or an explicit static role/placeholder marker can never animate. For marker-free legacy SVGs only, top-level groups whose id tokens look like page chrome (background, header/footer, decorations, watermark, page number, nav, logo, dividing rule) are excluded and appear with the slide. An explicit `animations.json` group entry may override this id-name heuristic, but never an explicit structural marker. Examples that auto-skip by legacy id: ``, ``, ``, ``, ``, ``, ``, ``, ``. Examples that still animate: ``, ``, ``, ``. Do not strip the `` wrapper to avoid animation — keep it for PowerPoint group selection and use `effect: none` when the content should remain static. @@ -182,7 +199,23 @@ Narration injection merges audio timing into an existing direct `p:sld/p:timing` --- -## 7. Limitations +## 7. Video Adaptation Contract + +Custom animation remains the semantic source for video motion. A downstream +video renderer must consume a resolved conversion trace through +`video_motion_plan.py`, not infer motion from delay values or read an unresolved +sidecar directly. + +The plan locks object identity, object order, source effect, semantic direction, +and timing anchors. Video-only adaptation may refine easing, travel distance, +opacity, scale, mask feather, blur, motion blur, and overshoot. Unsupported +effect families must fail visibly rather than silently becoming generic fades. +See [`video-motion-plan.md`](../scripts/docs/video-motion-plan.md) for the schema +and renderer contract. + +--- + +## 8. Limitations - **Native DrawingML output only.** Page transitions and per-element animations are authored on the PPTX produced by the project converter from `svg_output/`. `svg_final/` remains a static SVG visual preview, not an animated or alternate PPTX route. - **PowerPoint OOXML scope.** Effects preserve their established filter / `presetID` / `presetSubtype` tuples and are validated against the serialized PowerPoint package. Rendering in Keynote, LibreOffice, WPS, or other applications is outside the unconditional compatibility guarantee. @@ -191,7 +224,7 @@ Narration injection merges audio timing into an existing direct `p:sld/p:timing` --- -## 8. Quick Reference +## 9. Quick Reference | Goal | Command | |---|---| @@ -208,9 +241,11 @@ Narration injection merges audio timing into an existing direct `p:sld/p:timing` | All groups animate together | `-a auto --animation-trigger with-previous` | | Slower per-element reveal | `-a auto --animation-duration 0.5` | | Wider gap in after-previous | `-a auto --animation-stagger 0.7` | +| Derive effect-aware video motion | `video_motion_plan.py /validation/.trace.json --force` | See also: - [`scripts/docs/svg-pipeline.md`](../scripts/docs/svg-pipeline.md) for the full `svg_to_pptx.py` reference. - [`pptx-transitions.md`](../scripts/docs/pptx-transitions.md) for the shared OOXML writer, MCE preservation, and read-back contract. - [`pptx-animations.md`](../scripts/docs/pptx-animations.md) for the exact effect tuples, timing-tree rules, and animation package validator. +- [`video-motion-plan.md`](../scripts/docs/video-motion-plan.md) for the resolved animation-to-video enhancement contract. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md index e6811d68..3ece3e21 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/executor-base.md @@ -131,6 +131,7 @@ Before drawing each page, look up its entry in `page_rhythm` (key format `P` - **Proximity**: group related elements with tight spacing; separate unrelated groups - **Element grouping (Mandatory)**: wrap each logical Slide-local body unit in a descriptive, page-unique top-level ``. Every visible direct root `` declares root-coordinate `data-pptx-bounds="x y width height"`; frame/native coordinates do not replace it, and placeholder bounds also supply the slot frame. Nested groups need no bounds and any such values are ignored. Checker compares root bounds with the `viewBox` and recursively checks only estimable text against its root module: through `1px` is ignored, through `5%` warns, above `5%` fails per side. Images, shapes, paths, ``, effects, and object frames remain geometrically free. Flat pages use ordinary groups; structured slots already qualify, while titles, direct Master/Layout atoms, and canvas-level static framing may remain root primitives. On flat pages, give a root background image or full-canvas scrim/decoration rectangle a stable `id` plus `data-pptx-role="background"` / `"decoration"`; never wrap it only to silence the advisory. +- **Reference — not a constraint**: top-level groups set semantic and automatic-animation granularity, but they may contain descriptive nested `` edit groups when the page has meaningful internal subunits. Nested groups need no bounds and create no automatic animation step; use or omit them from the page's actual editing semantics, with no default pattern, depth, or quota. - **Default — size `data-pptx-bounds` as the intended module zone, not a glyph box (may skip when no text is estimable)**: make the zone as generous as the canvas and sibling layout allow, without overlapping another module zone. An untransformed line spans `y - 0.85 × font_size` to `y + 0.35 × font_size`; width uses the shared SVG-to-PPTX per-run estimate and safety headroom. If text does not fit, first expand a zone that has unused non-overlapping space; otherwise reflow or adapt. Larger bounds do not repair off-canvas text. - **Spec adherence**: follow color, layout, canvas format, and typography in the spec - **Template structure**: inherit the native visual framework only for `template_reuse_scope: mirror|layout`; `style` uses the flat route diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards-core.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards-core.md index 3311b6b0..f2026642 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards-core.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/references/shared-standards-core.md @@ -587,6 +587,14 @@ These forms are needed only when the stated PPT behavior matters: Wrap each logical Slide-local body unit in one descriptive top-level ``; group count follows the page's semantic units, and each group becomes one animation step when animation is enabled. Nested implementation groups may remain anonymous and need no bounds; any nested bounds are ignored. Flat pages use ordinary groups; structured slots already qualify, while titles, direct atomic Master/Layout elements, and canvas-level static framing—including background images and full-canvas scrim/decoration rectangles—may remain root primitives. On flat pages, give such static framing a stable `id` plus `data-pptx-role="background"` / `"decoration"`; never add a `` solely to silence an ungrouped-element advisory. +**Reference — not a constraint**: A top-level semantic group may contain +descriptive nested `` edit groups when its internal elements form useful +subunits, such as icon + title, value + label, or repeated information rows. +Nested groups carry no `data-pptx-bounds` and create no automatic animation +step; an unnecessary one-child wrapper may flatten. Choose whether and how +deeply to nest from the page's actual editing semantics—there is no default +nesting pattern, level, or quota. + **Structural atoms and slots are excluded automatically.** `data-pptx-layer` and `data-pptx-placeholder` semantics are read first; otherwise explicit `data-pptx-role` values (`background`, `decoration`, `header`, `footer`, `chrome`, `watermark`, `page-number`, `logo`) mark Slide-local static framing (§4.1, [`semantic-svg.md`](semantic-svg.md)). A normal slot group has exactly one direct compatible carrier; several drawing atoms require the explicit composite `object` proxy fallback. Native chart/table carrier groups retain their specialized [`native-data-interface.md`](./native-data-interface.md) contract. **What to group** (one `` per unit): @@ -610,7 +618,7 @@ separate parent content group; never put them inside the preset group itself. - One giant `` around the whole slide (collapses to a single animation step). - Many ungrouped Slide-local `` / `` / `` atoms — they have no stable sidecar target and selection/editing degrades. Primitive fallback applies only when the root contains no top-level `` at all; it is capped at 8 visible primitives. -- One group per icon / text line / mark (too many steps). +- One top-level group per icon / text line / mark (too many animation steps). - Anonymous top-level groups — every top-level semantic group needs a descriptive `id`. **Naming — required.** A descriptive, page-unique `id` on every top-level content `` (`card-1`, `step-discover`, `header`, `footer`) is mandatory; it is the stable SVG-side animation and trace anchor. An anonymous top-level group still converts, but `animations.json` cannot reference it; an anonymous one-child implementation wrapper may also flatten. Primitive fallback is unrelated and applies only to roots with no top-level groups. @@ -620,8 +628,10 @@ separate parent content group; never put them inside the preset group itself. - 10× - Faster + + 10× + Faster + Reduce production time from days to hours. ``` diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/pptx-animations.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/pptx-animations.md index 23d96a64..2565c650 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/pptx-animations.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/pptx-animations.md @@ -83,6 +83,25 @@ The registry preserves these established 22 tuples exactly: `cut` is a legacy public key. Compatibility promises the tuple above; it does not infer a different semantic name from external preset-id tables. +Seven directional variants extend the registry without changing any established +tuple: + +| Key | `p:animEffect@filter` | `presetID` | `presetSubtype` | +|---|---|---:|---:| +| `fly_left` | `slide(fromLeft)` | 2 | 8 | +| `fly_right` | `slide(fromRight)` | 2 | 2 | +| `fly_top` | `slide(fromTop)` | 2 | 1 | +| `wipe_left` | `wipe(left)` | 22 | 8 | +| `wipe_right` | `wipe(right)` | 22 | 2 | +| `wipe_up` | `wipe(up)` | 22 | 1 | +| `wipe_down` | `wipe(down)` | 22 | 4 | + +The existing `fly` key remains fly-in from bottom. The existing `wipe` key +keeps its historical `wipe(left)` / subtype `1` tuple; use `wipe_left` for +PowerPoint's native left-direction subtype `8`. Directional keys are explicit +effect names rather than a new configuration field, so version-1 sidecars and +the read-back model remain unchanged. + **Hard rule — no downgrade**: - Keep the 22 established tuples byte-for-byte equivalent in meaning. @@ -175,6 +194,13 @@ targets. Template fill and native enhancement fingerprint the source object-animation tree before and after their allowed edits; any semantic change fails. These routes have no object-animation write ownership. +The conversion trace is also the authoritative input for downstream video +motion. `video_motion_plan.py` preserves the resolved effect tuple, direction, +row order, duration, absolute offset, object bounds, and narration-derived slide +advance while adding only renderer-specific enhancement parameters. Video +renderers must not bypass this read-back result and infer motion from sidecar +delay values alone. + --- ## 7. Compatibility Scope @@ -192,3 +218,5 @@ Official references: See [`pptx-transitions.md`](./pptx-transitions.md) for the symmetric page-motion core, MCE handling, and slide-advance contract. +See [`video-motion-plan.md`](./video-motion-plan.md) for the downstream +animation-to-video contract. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md index ce104495..b4446af7 100644 --- a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/svg-pipeline.md @@ -349,6 +349,7 @@ Behavior: - Native output uses content-hash media filenames, so identical images are reused and different images cannot overwrite each other by sharing a basename. - `[Content_Types].xml` is generated from the actual media extensions written into the PPTX. Unknown media extensions fail unless Python's `mimetypes` can identify them. - Native export writes to a temporary file first and publishes the requested PPTX only after conversion succeeds. A failed conversion does not replace the main output file. +- `--conversion-trace` without a path writes `validation/.trace.json`. `--conversion-trace ` respects the explicit destination; relative paths are resolved from the project root, so `exports/.trace.json` remains available when intentionally requested. - After publication, native export writes `validation/.report.json`. The report distinguishes authored Slides from internal Layout definitions, reruns ZIP integrity and published Slide-count checks, records slide/layout/master/notes part counts, labels relationship/structured/transition/animation validation as enforced at build time, links the final SVG quality report only when its SHA-256 source fingerprint matches the exact export inputs, and surfaces stale/unverified gates, unresolved template tokens, generic-only font stacks, and external image references. A matching final quality report with introduced warnings yields `passed-with-warnings` and a `quality_introduced_warnings=` receipt instead of a clean `passed` claim. - By default, a successful command also prints a compact receipt instead of requiring a report read: `[POSTFLIGHT] status=<...> quality_gate=<...> slides= warning_categories=`, followed by one compact line per warning category and the `[PPTX]` / `[REPORT]` paths. Resource-warning lines carry counts; a non-passing quality gate carries its status. Routine agents use this receipt and do not load either complete validation JSON into model context. Full reports remain cold audit artifacts; failure investigation and explicit audits extract only the required fields. `--quiet` keeps suppressing successful-run output. - Before publishing structured template output, export reopens the temporary PPTX and validates the Slide → Layout → Master graph and registrations, Layout identity, placeholder identity, reusable bounds, and prompt/level-one sizes. A mismatch aborts publication. Flat release instead validates its single referenced Master/Layout shell and exact date/footer/slide-number hook roster before packaging. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/video-motion-plan.md b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/video-motion-plan.md new file mode 100644 index 00000000..00286820 --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/docs/video-motion-plan.md @@ -0,0 +1,116 @@ +# Video Motion Plan + +`video_motion_plan.py` converts a resolved SVG-to-PPTX conversion trace into a +renderer-neutral motion plan. It is the handoff between PPT Master's canonical +custom animation and any SVG-native or post-production video renderer. + +The planner exists to prevent a video path from reducing animation to delay +values. The conversion trace is authoritative because it already contains the +resolved object target, effect, direction tuple, order, duration, offset, slide +advance, and native object bounds after sidecar inheritance and narration +synchronization. + +--- + +## 1. Generate a Resolved Source Trace + +For a narrated deck, generate the trace from the narrated export so its offsets +and slide advances include the final audio timing: + +```bash +python3 skills/ppt-master/scripts/svg_to_pptx.py \ + --recorded-narration audio \ + --conversion-trace \ + -o /validation/video_motion_source.pptx +``` + +Then build the motion plan: + +```bash +python3 skills/ppt-master/scripts/video_motion_plan.py \ + /validation/video_motion_source.trace.json \ + -o /validation/video_motion_plan.json \ + --style adaptive \ + --force +``` + +`restrained` and `dynamic` are explicit intensity alternatives. `adaptive` is +the default and adjusts enhancement strength from page role, animated-object +count, and object area. + +--- + +## 2. Authority and Locks + +The downstream renderer must preserve: + +- object identity and SVG group id; +- object order; +- source effect; +- semantic direction; +- resolved start time and slide timing anchor. + +The video layer may optimize only the declared `optimizer_scope` parameters: +easing, travel distance, opacity, scale, mask feather, blur, motion blur, and +overshoot. These additions can make motion feel more cinematic without +rewriting the presentation's choreography. + +Do not derive a video plan directly from raw `animations.json` or +`narration_animations.json`. Raw sidecars may still contain inheritance, +`auto`, timing modes, or narration-relative values. Always use the resolved +conversion trace. + +--- + +## 3. Effect Mapping + +Each object keeps `source_effect` and receives a compatible video family: + +| Source effect | Video family | +|---|---| +| `appear` | `hard_reveal` | +| `fade` | `soft_fade` | +| `dissolve` | `grain_dissolve` | +| `fly*`, `cut` | `directional_slide` | +| `wipe*`, `peek` | `soft_mask_reveal` | +| `zoom`, `expand`, `stretch` | `focus_scale` | +| `split` | `split_mask` | +| `box`, `circle`, `diamond`, `plus` | `shape_mask` | +| `blinds`, `checkerboard`, `random_bars`, `strips`, `wedge`, `wheel` | `pattern_reveal` | +| `swivel` | `soft_swivel` | + +This mapping is an enhancement contract, not permission to substitute an +unrelated effect. A directional slide remains directional; a wipe remains a +mask reveal. + +--- + +## 4. Output Contract + +The output schema is `ppt-master.video-motion-plan.v1`. Each slide records: + +- SVG source and canvas size; +- page role; +- slide duration and its source; +- resolved transition; +- ordered animated objects. + +Each object records: + +- `group_id`, native `shape_id`, and order; +- source effect and trigger; +- absolute `start_ms` and `duration_ms`; +- native `bounds_emu` and normalized area; +- renderer parameters under `video`. + +The planner rejects click-triggered animation because a rendered video has no +interactive click event. Re-export with click-free `after-previous` or +`with-previous` timing first. + +--- + +## 5. Current Boundary + +This script owns the semantic handoff and deterministic enhancement policy. It +does not encode video by itself. A renderer that consumes the plan must report +unsupported families instead of silently falling back to delay-only fades. diff --git a/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/powerpoint_video.py b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/powerpoint_video.py new file mode 100644 index 00000000..f5991dde --- /dev/null +++ b/plugins/codex/plugins/ppt-master/skills/ppt-master/scripts/powerpoint_video.py @@ -0,0 +1,407 @@ +#!/usr/bin/env python3 +""" +PPT Master - PowerPoint Video Export + +Export a narrated PPTX through the installed Windows PowerPoint application and +wait until its native video encoder finishes. + +See workflows/stages/generate-audio.md for the narration handoff. + +Usage: + python3 scripts/powerpoint_video.py [-o