Install
$ agentstack add skill-zhu1090093659-deepseek-pp-morph-ppt Open-source listing, not yet scanned by AgentStack. Follow the source repository for install instructions.
Security review
⚠ Flagged2 finding(s); flagged for manual review. · v0.1.0 How review works →
- • Prompt-injection patterns
- • Secret / credential exfiltration
- • Dangerous shell & filesystem operations
- • Untrusted network calls
- • Known-malicious package signatures
- high Dangerous shell/eval execution.
- high Pipes remote content directly into a shell (remote code execution).
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ● Shell / process execution Used
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
OfficeCLI Morph-PPT Skill
This skill is a scene layer on top of officecli-pptx. Every pptx hard rule — visual delivery floor (title ≥ 36pt / body ≥ 18pt / title ≥ 2× body), 12-column grid on 33.87×19.05cm, canonical palettes, chart-choice decision table, connector canon, shell escape, resident + batch, Delivery Gate 1–5a — is inherited, not re-taught. This file adds only what Morph needs on top: cross-slide shape-name binding, Scene Actors vs content prefixing, ghost discipline, transition=morph CLI quirks, 52-style visual library lookup, and a morph-specific fresh-eyes Gate 5b extension.
When the pptx base rules cover it, the text here says → see pptx v2 §X. Read skills/officecli-pptx/SKILL.md first if you have not.
Setup
If officecli is missing:
- macOS / Linux:
curl -fsSL https://d.officecli.ai/install.sh | bash - Windows (PowerShell):
irm https://d.officecli.ai/install.ps1 | iex
Verify with officecli --version (open a new terminal if PATH hasn't picked up). If install fails, download a binary from https://github.com/iOfficeAI/OfficeCLI/releases.
⚠️ Help-First Rule
This skill teaches the Morph workflow — when shape names must match, when to ghost, when the CLI auto-prefixes — not every command flag. When a prop name, enum, or preset is uncertain, consult help BEFORE guessing.
officecli help pptx slide # authoritative for: transition, advanceTime, advanceClick, background
officecli help pptx shape # name, preset, x/y/width/height, fill, rotation, opacity, animation
officecli help pptx animation # preset + trigger + duration values
officecli help pptx --json # machine-readable schema
Help reflects the installed CLI version. When skill and help disagree, help wins. Every --prop X= in this file is grep-verified against officecli help pptx . Specific confirmations: transition=morph is a listed value on slide; advanceTime / advanceClick are valid. There is NO standalone transition element — officecli help pptx transition returns error. Sub-props such as duration / delay / easing for the transition itself are not exposed on slide — see §Known Issues for the raw-set path if you need them.
Mental Model & Inheritance
Inherits pptx v2. You should have read skills/officecli-pptx/SKILL.md first. This skill assumes you know how to: add slides + shapes + charts + connectors; address by @name= / @id=; quote paths; use batch heredocs; use tailEnd=triangle on flow connectors; run the Delivery Gate 1–5a; attribute [AGENT-ERROR] vs [RENDERER-BUG] vs [SKILL gap]. If any of those are unfamiliar, read pptx v2 first.
Inherited from pptx v2 (do NOT re-teach):
- Visual delivery floor — title ≥ 36pt / body ≥ 18pt / title ≥ 2× body, cover-richness, contrast floor, no
\$\t\nliterals, ≤ 1 animation per slide / ≤ 600ms. - Grid math — 33.87 × 19.05cm, edge margin ≥ 1.27cm, inter-block gap ≥ 0.76cm, ≥ 20% negative space. For N-card grids:
col = (33.87 − 2·margin − (N−1)·gap) / N. - Four canonical palettes (Executive navy / Forest & moss / Warm terracotta / Charcoal minimal) — morph decks may pick a different mood from
reference/styles/, but contrast rules still apply. - Chart-choice table — column vs bar vs line vs pie vs scatter vs large-text KPI;
> 3 series + > 8 categories= split. - Connector canon —
shape=straight|elbow|curve,@id=for from/to (C-P-6),tailEnd=triangleon every flow. - Shell escape 3-layer —
$single-quoted, heredocs for batch, `` for real newlines. - Resident mode + batch ≤ 12 ops, `/dev/null || true # name path may fail after morph — see Known Issues
Verify morph pair: identical names on slides 1 & 2
officecli get "$FILE" /slide[1] --depth 1 --json | jq -r '.data.children[]?.format.name // empty' officecli get "$FILE" /slide[2] --depth 1 --json | jq -r '.data.children[]?.format.name // empty'
Compare — !!scene-ring and !!scene-dot MUST appear on both, byte-identical.
### (c) Continuous multi-slide morph (story arc) — use helpers
**Visual outcome.** A 5-slide arc telling one continuous story: same 2 scene actors drift across the canvas as the narrative progresses; content (`#sN-*`) refreshes per slide and is ghosted on the next. Building this by hand is ~60 commands — use `reference/morph-helpers.py` to keep the build script short and auto-verified.
```python
#!/usr/bin/env python3
# Invoke the provided helper library for clone + ghost + verify
import subprocess, sys, os
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
HELPERS = os.path.join(SCRIPT_DIR, "reference", "morph-helpers.py")
FILE = "deck.pptx"
def helper(*args):
subprocess.run([sys.executable, HELPERS, *[str(a) for a in args]], check=True)
# ... assume slide 1 is built with 2 scene actors (!!scene-ring, !!scene-dot) + #s1-title
# Helper builds slide 2–5 with: clone from previous + apply transition=morph + ghost previous #sN- content
for n in range(2, 6):
helper("clone", FILE, n - 1, n) # clone + set transition=morph + list shapes
helper("ghost", FILE, n, "all-content") # ghost all #s(n-1)-* via duplicate-text detection
# …then add THIS slide's #sN- content via officecli add as normal…
helper("final-check", FILE) # structural pass; DOES NOT catch !! lingering in visible area
Helper signatures and source: reference/morph-helpers.py (clone, ghost, verify, final-check). The shell equivalent is reference/morph-helpers.sh — pick one per platform; do not mix.
When to use helpers vs raw officecli. For 2-3 slide decks, raw commands (recipes a, b) are clearer. For 5+ slides with repeating clone/ghost/verify cadence, helpers save ~40% of commands and provide built-in verification. Every slide is still closed by officecli validate before delivery.
(d) Morph + fade hybrid — entrance on morph slide
Visual outcome. A morph pair where !!scene-ring moves continuously while a NEW per-slide card fades in simultaneously. Used when a morph-paired backdrop carries the eye and fresh foreground content needs a softer entrance than a raw appearance.
# Slide 2 already has transition=morph and !!scene-ring. Add a new card with fade-entrance.
officecli add "$FILE" /slide[2] --type shape --prop 'name=#s2-card' --prop preset=roundRect \
--prop fill=F5F7FA --prop line=none --prop x=2cm --prop y=12cm --prop width=10cm --prop height=5cm
# Apply simultaneous-with-morph fade entrance to the new card.
# 'fade-entrance-300-with' = fade in, 300ms, trigger=withPrevious (plays with the morph transition).
officecli set "$FILE" "/slide[2]/shape[@name=#s2-card]" --prop animation=fade-entrance-300-with
officecli get "$FILE" "/slide[2]/shape[@name=#s2-card]" --json | jq '.data.format.animation' # readback sanity
Why this works. Morph animates the !!scene-* shapes only (they have a pair on slide 1); the new #s2-card has no slide-1 counterpart, so morph would default-fade it — fade-entrance-300-with makes that fade explicit and timed. Keep the animation per pptx v2 floor: ≤ 600ms, no bounce / swivel / fly-from-edge (officecli help pptx animation for the canonical preset list).
Choreography — animation types + staggered timing
How morph animates multiple shapes determines what the audience sees. Pick the right mechanism for each pair:
| Animation type | How to achieve it (between Slide A and Slide B) | |---|---| | Simple move | Same !! name on both slides, same size, different x/y — morph interpolates position | | Scale transform | Same name, different width/height — morph interpolates size (and re-positions the center) | | Move + scale | Different x, y, width, height simultaneously — morph handles all dimensions at once | | Color / opacity shift | Same name, different fill or opacity — morph cross-fades the fill | | Rotation | Same name, different rotation (degrees) — morph rotates along the shortest arc | | Font size change | Same name, different size (pt) on text shape — interpolates in PowerPoint 365; less reliable on Keynote / WPS / LibreOffice (may degrade to crossfade). For portable motion, pair size change with a matching width/height delta or an x/y displacement — the spatial change keeps motion visible when size interpolation drops out | | Enter (fade in) | Shape exists only on Slide B (no counterpart on A) — morph fades it in | | Exit (fade out) | Shape exists only on Slide A (no counterpart on B) — morph fades it out |
Multi-shape timing constraint. All !! shapes in one morph pair animate simultaneously — there is no per-shape delay / duration knob in the CLI (help confirms: no morph.duration / morph.delay on slide). To stagger shape A before shape B, split the transition into two pairs with an intermediate slide:
Slide 2 → Slide 3: !!actor-A moves (!!actor-B stays put)
Slide 3 → Slide 4: !!actor-B moves (!!actor-A stays put or ghosts)
Slide 3 is an explicit intermediate keyframe. Do NOT attempt to fake staggering via timing props on the shape's animation= prop — Morph runs before per-shape animations.
Good-enough variety heuristic (Best Practice — creative flexibility). For a morph to read as "motion", change at least 3 of {x, y, width, height, rotation, fill, opacity} on the dominant paired shape, with displacement ≥ 5cm OR rotation ≥ 15° OR size delta ≥ 30%. One shape × 3 props is a valid creative pattern (focus on one hero element).
Delivery Gate 5b-morph-2 is stricter. The gate hard-asserts ≥ 3 DIFFERENT !!-prefixed shapes each vary by ≥ 1 of {x, y, width, height, rotation, font-size} across the pair — integrity check for "is this really a morph or a pretend-morph". Heuristic informs creative intent; Gate decides delivery. Brand-constant scenery (pinned header strip, footer bar, logo badge) does NOT count toward the 3-shape quota — these are supposed to stay put; motion must come from 3 other named shapes. When in doubt, satisfy the stricter Gate.
Deck-length rhythm. Filling every transition with morph reads as anxious, not cinematic. Pace morph moments to deck length:
- 8-10 slides (dense): 3-5 morph moments; motion can cluster.
- 12-18 slides (ceremonial): 3-5 TOTAL morphs, spaced every 4-6 slides; use
transition=morphat section dividers so the animation reads as chapter punctuation, not continuous agitation. - 18+ slides (Act-based): structure into 3 acts with 1 long section-divider morph between acts (5-10s of deliberate motion with a brief hold), plus 2-3 quieter morphs inside each act. Lean heavier on
!!scene-*continuity than per-slide!!actor-*churn.
Scene-actor spatial rule
Scene actors and actors moving across the canvas MUST stay in predictable zones during morph — otherwise they cross over content and read as clutter.
Safe zones (prefer for scene actor rest positions and morph paths):
Top-right corner: x ≥ 24cm, y ≤ 6cm
Bottom-right: x ≥ 24cm, y ≥ 12cm
Bottom-left: x ≤ 2cm, y ≥ 12cm
Off-canvas (ghost): x ≥ 33.87cm (canvas right edge; use x=36cm for explicit ghost)
Avoid resting actors in the content core: x = 2~28cm, y = 3~16cm. Actors may pass through the core during morph (that's the motion), but they should not end a slide parked there with high opacity unless they are content themselves (!!actor-* carrying the slide's message).
Before placing any scene actor, inspect existing shape bounds:
officecli get "$FILE" "/slide[$N]" --depth 1 --json | \
jq -r '.data.children[]? | "\(.format.name // .path) x=\(.format.x) y=\(.format.y) w=\(.format.width) h=\(.format.height)"'
Confirm the actor's target position does not overlap any #sN-* content shape's bounding box (x to x + width, y to y + height). If it would overlap, lower actor opacity ≤ 0.15 OR move it to a safe zone.
Style library lookup workflow
reference/styles/ holds 52 visual style directories (dark / light / warm / vivid / bw / mixed moods) — design inspiration, not templates. Use the library as on-demand reference, not as a content dump.
Why lookup, not copy. Each of the 52 build.sh files is a complete style demo — but the coordinates were hand-tuned for that specific demo's content length. Copying them verbatim into a deck with different content produces overlaps and misalignment (flagged in INDEX.md L5-11). The library's value is the design logic: palette choice for a mood, signature shape, choreography pattern. Apply that logic to your own grid math.
Four-step lookup:
- Browse INDEX.
reference/styles/INDEX.mdgroups all 52 styles by palette category and mood (e.g.dark--premium-navy= authoritative / refined;warm--earth-organic= organic / grounded). The Quick Lookup table also shows each style's primary hex trio (bg / fg / accent) — if the user specified a brand color, scan the hex column to find the nearest match without opening everystyle.md. Pick 1 style that matches the topic mood OR aligns with the user-specified hex. - Read philosophy. Open
reference/styles//style.mdfor design intent — type pairing, color logic, signature elements. - Glance technique. Open
reference/styles//build.shONLY for technique reference (signature shapes, palette hex codes, choreography ideas) — coordinates are known-buggy perINDEX.mdL5-11; do not copy them. - Apply on your own canvas. Build your deck using pptx v2 grid math + visual floor; borrow only the palette and the signature gesture.
Pointer: → see reference/styles// — never inline-copy coordinates from a style build.sh.
Delivery Gate (inherits pptx v2 + morph additions)
Gate 1–5a: full port from pptx v2. → see pptx v2 §Delivery Gate. Schema (whitelisting C-P-2 chart spPr), token grep ($…$ / {{…}} / \$\t\n / () / []), hyperlink rPr (C-P-1), slide-order sanity, dark-on-dark contrast (Gate 5a). Refuse to declare done until every pptx Gate 1–5a prints its OK message. Morph decks have the same token / schema / order risks as any pptx.
Gate 2 morph addendum — price / metric tokens eaten by zsh
Pptx v2 Gate 2 covers $…$, {{…}}, \$\t\n literals, empty () / []. Morph decks add a class of leaks: price / metric tokens ($9/mo, $29/month, $199/yr) written in double-quoted --prop text="…" — the shell eats $9 as an empty variable and the CLI stores /mo or a stray period. Run this in addition to pptx Gate 2:
# Gate 2 morph — price / metric token leaks + stray-period placeholders
# Pattern hits: bare prices ($9, $29, $9.99), /unit suffix ($9/mo, $199/yr), ${VAR}, \n/\r/\t, lone period
LEAKS=$(officecli view "$FILE" text | grep -nE '\$[0-9]+(\.[0-9]+)?(/(mo|month|yr|year|day|wk|week|hr|hour))?|\$\{[A-Z_]+\}|\\[nrt]|^\.$' || true)
if [ -z "$LEAKS" ]; then echo "Gate 2 morph OK"; else echo "LEAK: $LEAKS"; fi
Covers: $9 $9.99 $29/month $199/yr $1/day ${VAR} \n/\r/\t literals + stray . placeholders. Fix: single-quote the prop (--prop text='$9/mo').
Gate 5b — Visual audit via HTML preview (MANDATORY) — extended for morph
Run officecli view "$FILE" html and Read the returned HTML path. For every slide, answer the pptx v2 Gate 5b questions (overlap / dark-on-dark / divider overlap / order sanity / missing arrowheads) PLUS these four morph-specific checks:
Important: selectors with prefix match. officecli query only supports operators =, !=, ~=, >=, `, ]') if [ "$VARIES" -lt 6 ]; then echo "pair $K→$((K+1)) FLAT: only $VARIES diff-lines (need ≥ 6 = 3 shapes × 2 sides)"; fi done ```
- 5b-morph-3 — Morph-pair name mismatches. Adjacent slides must share at least 2
!!-prefixed names exactly. Proof (note:.data.children[]— bare.children[]returns null):
```bash for N in 1 2 3 4 5; do echo "--- slide $N ---" officecli get "$FILE" "/slide[$N]" --depth 1 --json
…
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: zhu1090093659
- Source: zhu1090093659/deepseek-pp
- License: Apache-2.0
- Homepage: https://chromewebstore.google.com/detail/deepseek++/kdmpkkahkhdmdhfkdihkopikgcocbpbf?hl=zh-CN&authuser=0
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.