CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/speaker-toolkit

Seven-skill presentation system: ingest talks into a rhetoric vault, run interactive clarification, generate a speaker profile, create presentations that match your documented patterns, produce the deck illustrations + thumbnail visual layer, publish talk pages to a Jekyll shownotes site, and verify a recorded screencast against its storyboard. Includes a 113-entry Presentation Patterns taxonomy (83 observable: 64 patterns + 19 antipatterns; 30 unobservable: 21 patterns + 9 antipatterns) for scoring, brainstorming, and go-live preparation.

74

Quality

93%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Low

Low-risk findings worth noting

Overview
Quality
Evals
Security
Files

deck-editing-rules.mdrules/

alwaysApply:
Yes

Deck Editing Rules

How to make STRUCTURAL edits (delete / reorder / cross-deck import) to an existing .pptx and how to apply illustration backgrounds — distinct from generating slide structure (see rules/slide-generation-rules.md).

Don't Edit Decks With python-pptx

  • python-pptx and clipboard Slides.Paste drop each slide's <p:bg> picture fill, flattening illustrated decks whose full-bleed art is a background fill.
  • python-pptx editing OOXML from outside the app breaks strict OOXML that Keynote refuses to open.
  • All structural edits go through RunDeckOps — there is no python-pptx slide-delete / slide-reorder path.

Use Real PowerPoint via RunDeckOps (macOS)

  • Drive the actual PowerPoint app so PowerPoint serializes the file — fonts, full-bleed backgrounds, masters, and relationships are preserved and the output stays Keynote-openable. The original is never modified (the macro writes a COPY).
  • skills/presentation-creator/scripts/RunDeckOps.bas builds the target deck with Slides.InsertFromFile (the programmatic "Reuse Slides", keep-source- formatting — NOT clipboard paste). Invoke it through skills/presentation-creator/scripts/run-deck-ops.sh:
    bash skills/presentation-creator/scripts/run-deck-ops.sh \
      <basePath> <outPath> <importSpec> <orderStr> <replaceStr>
    # orderStr: "BASE:1 BASE:2 voxxed:13 BASE:49"  (alias:1-based-slide-#)
  • One-time setup is a manual, GUI-bound sequence (enable VBA macros, create the DeckOps.pptm macro container, import the .bas, grant Automation consent). Walk the user through it interactively — see skills/presentation-creator/references/deck-editing-setup.md.
  • Never assume whether setup has been done — run deckops-doctor.py --vault-root <path> and act on its status. Statuses and their routing live in Step 0 of the setup doc.
  • The doctor is the only reader of a STALE macro import. A saved .pptm yields no VBA source; the loaded module's content stamp comes back from the running PowerPoint, never off disk.
  • A container imported before the stamp existed answers no version at all. The doctor reads the .pptm to tell that from a container that never had the module — classification lives in skills/presentation-creator/scripts/deckops-doctor.py's inspect_container / verdict.
  • The file read refines the verdict; the live probe remains the authority.
  • The macro container has one canonical location, <vault_root>/.deckops/DeckOps.pptm. The importable .bas is exported beside it with sync-deck-drivers.py export --to <vault_root>/.deckops.
  • Never hand the user an import path inside the plugin tree.

Add a Generated Illustration as a Slide Background

  • A generated illustration must become the slide's BACKGROUND FILL, not a top-pasted picture: the layout's halftone-dot overlay sits above the slide background but below shapes, so a pasted picture lands above the dots.
  • Don't hand-build the slide in python-pptx: a fresh deck can't borrow the source deck's layout (and its overlay).
  • RunDeckOps.bas's MakeBgImageSlide clones a comic template slide, sets Slide.Background.Fill.UserPicture, retitles, and saves a 1-slide deck. Pick a template whose title sits in the image's clear safe zone. Invoke via bash skills/presentation-creator/scripts/make-bg-slide.sh, then import with bash skills/presentation-creator/scripts/run-deck-ops.sh (order token <alias>:1).
  • Generate the illustration first with the illustrations skill, then make it a background slide here.

Set Illustration Backgrounds in Bulk at Creation Time

  • When building a NEW deck, FULL-slide illustrations must also be slide BACKGROUND FILLS, not picture shapes — same overlay reason as above. python-pptx must not insert them as shapes, and must not be the last writer (it re-drops <p:bg> fills on save).
  • apply-illustrations-to-deck.py records each FULL slide in a backgrounds manifest (--backgrounds-out) and applies only scrim + title; it does NOT insert FULL-slide pictures. IMG+TXT slides keep a left-column picture shape.
  • RunDeckOps.bas's ApplyBackgrounds then sets all FULL backgrounds via Slide.Background.Fill.UserPicture in one pass. Invoke via bash skills/presentation-creator/scripts/apply-backgrounds.sh <baseCopy> <out> <manifest.json>.
  • Run this as the FINAL write of the build — after the structural walk, scrim/ title, and speaker-note injection — so no later python-pptx save drops the fills.

Progressive-Reveal Build Expansion

  • RunDeckOps.bas's ExpandBuilds replaces each progressive-reveal parent slide with its build frames as full-bleed background-fill slides (notes on the final frame only), via real PowerPoint slide insertion — never python-pptx. Invoke via bash skills/presentation-creator/scripts/expand-builds.sh <baseCopy> <out> <builds-manifest.json> (manifest from build-expansion-manifest.py).
  • Run ExpandBuilds BEFORE the by-index passes (notes, backgrounds, QR): it renumbers every slide after a build parent, so those passes must key on the POST-expansion deck. It processes parents descending so one parent's expansion can't shift another's index.

macOS-Only — VBA Layer Untestable in CI

  • The PowerPoint-driving layer (VBA + AppleScript) needs the Microsoft PowerPoint app and macOS Automation, so it CANNOT run in Linux CI. Validate it manually: re-open output in PowerPoint AND Keynote; confirm size recovers and a <p:bg>-blipFill check finds the expected slides.
  • The deterministic Python/shell helpers (illustration apply, manifest→spec) ARE unit-tested in tests/ — only the PowerPoint-driving layer is exempt.
  • Exempt artifacts: RunDeckOps.bas and every *.applescript driver beside it, deckops-version.applescript included. Their manual validation procedure is Step 5 of skills/presentation-creator/references/deck-editing-setup.md — what to run, what to observe, what counts as a pass.
  • skills/presentation-creator/scripts/deckops-doctor.py splits along the same line: the AppleScript probe is exempt, while path derivation, probe-output parsing, and the verdict table are unit-tested in tests/test_deckops_doctor.py against synthetic probe results.

Mac PowerPoint VBA Landmines (all handled in RunDeckOps)

  • Filename collision: PowerPoint keys open decks by filename and silently returns an already-open same-named deck from Presentations.Open. Always operate on UNIQUELY-NAMED copies; the macro also guards and errors loudly.
  • Slide.MoveTo / Slides.FindBySlideID raise E_INVALIDARG on current Mac builds — avoided by appending in target order via InsertFromFile.
  • SaveCopyAs rejects FileFormat / EmbedTrueTypeFonts enum args — use a bare SaveCopyAs FileName:=... (base is already .pptx).
  • Sandboxed PowerPoint can't create a file in a Google Drive File-Provider folder (E_FAIL): save to a local staging path, then move into Drive with the shell. run-deck-ops.sh does this automatically.

README.md

tile.json