| name | deck-assembler |
| description | Assemble a .pptx presentation from all DeckContext contracts (SlideOutline, StyleGuide, ImageManifest, ChartManifest, SpeakerNotes) via PptxGenJS. |
| argument-hint | ["--deck-dir PATH"] |
| allowed-tools | Bash(node *), Bash(npm *), Read, Glob |
/deck-assembler
Assemble a complete PowerPoint presentation from the DeckContext contracts in ./tmp/deck/.
Prerequisites
All of these DeckContext files must exist before running:
./tmp/deck/outline.json (SlideOutline)
./tmp/deck/style-guide.json (StyleGuide)
./tmp/deck/image-manifest.json (ImageManifest)
./tmp/deck/chart-manifest.json (ChartManifest)
./tmp/deck/speaker-notes.json (SpeakerNotes)
./tmp/deck/strategy-map.json (StrategyMap) — optional, controls per-slide rendering approach
./tmp/deck/images/ directory with referenced image files
Plugin Setup
PLUGIN_ROOT=$(python3 -c "
from pathlib import Path
import sys, os
if os.environ.get('JACK_TAR_DECKHAND_ROOT'):
print(os.environ['JACK_TAR_DECKHAND_ROOT']); sys.exit()
home = Path.home()
for base in [home / '.claude' / 'plugins' / 'cache']:
for p in base.rglob('jack-tar-deckhand/.claude-plugin/plugin.json'):
print(str(p.parent.parent)); sys.exit()
dev = Path.cwd() / 'plugins' / 'jack-tar-deckhand'
if dev.exists():
print(str(dev)); sys.exit()
print('NOT_FOUND')
" 2>/dev/null)
if [ -z "$PLUGIN_ROOT" ] || [ "$PLUGIN_ROOT" = "NOT_FOUND" ]; then echo "ERROR: jack-tar-deckhand not found" && exit 1; fi
Usage
Routing: Check for ./tmp/deck/template-profile.json first.
Template mode (template-profile.json exists):
PYTHONPATH="$PLUGIN_ROOT" python3 -c "
import json
from src.assembler.build_deck_template import build_deck
with open('./tmp/deck/template-profile.json') as f:
profile = json.load(f)
output = build_deck('./tmp/deck', profile['template_path'], profile)
print(f'Template deck assembled: {output}')
"
Standard mode (no template):
node src/assembler/build_deck.js --deck-dir ./tmp/deck
Default deck-dir is ./tmp/deck if not specified.
Output
./tmp/deck/output/presentation.pptx
What It Does
- Reads all DeckContext JSON contracts
- Validates that referenced image assets exist
- Creates PptxGenJS slide masters for all 12 slide types based on StyleGuide
- Iterates through SlideOutline, building each slide with:
- Correct master/layout per slide_type
- Headline and body points with StyleGuide typography
- Images from ImageManifest placed in correct zones
- Chart images from ChartManifest for data_chart slides
- Speaker notes from SpeakerNotes contract
- If strategy-map.json exists, routes slides to full_render (full-bleed AI image with title overlay), full_bleed (image IS the slide — zero chrome, issue #88), backdrop_render (AI background + text overlay), or composed (standard) assembly paths
- Generates progressive build slides for bullets with build_animation cues
- Writes the assembled .pptx to the output directory
- Reports file size and any asset warnings
Design Rules (from existing pptx skill)
- 0.5" minimum margins on all sides
- Never use
# prefix on hex colours (PptxGenJS convention)
- Do not reuse option objects (PptxGenJS mutates them)
- Left-align body text, centre only titles
- Do not place accent lines under titles
Limitations
- No native animations (PptxGenJS v4.0.1 limitation) -- uses progressive builds for ~80% coverage
- No gradient fills on shapes -- use pre-rendered gradient images as backgrounds
- Template mode requires python-pptx — PptxGenJS path does not support templates