Turn a short interview into a charming, vibrant, highly visual 3-slide new-marketing-campaign deck by filling a bundled PowerPoint template with a bundled Python script.
Step 1 — Interview the user
Ask for these (accept short answers; anything they skip gets a tasteful default). Ask them in a single, friendly batch:
- Brand name
- Campaign name (the headline of the launch)
- Tagline — one line that makes people lean in
- Target audience — who it's for
- The big idea — the single concept the campaign turns on (one sentence)
- Three key messages / benefits (exactly three)
- Channels / activation — where it runs (e.g. TikTok, out-of-home, retail)
- Call to action — the ask
- Closing line — the sign-off
- Brand accent color (optional,
#RRGGBB) — themes the whole deck
Step 2 — Write the answers file
Save the answers as JSON. All keys are optional; messages is a list of three.
{
"brand_name": "Vela",
"campaign_name": "Taste the Quiet",
"tagline": "Botanical sparkling water for your loudest days.",
"audience": "calm-seeking millennials",
"big_idea": "A moment of quiet in every can.",
"messages": ["Zero sugar, all serenity", "Adaptogens that work", "Guilt-free fizz"],
"channels": "TikTok · Out-of-home · Sampling",
"cta": "Pop the quiet.",
"closing": "Vela — find your fizz.",
"accent_hex": "#00A6A6"
}
See assets/answers.example.json for a complete example.
Step 3 — Build the deck
Run the bundled script to produce the finished presentation:
python scripts/build_campaign.py answers.json campaign-deck.pptx
It fills assets/campaign-template.pptx — replacing every {{PLACEHOLDER}}
while preserving the design, rendering the three key messages as visual cards,
and recoloring the deck to the brand accent color when one is given. Missing
answers fall back to sensible defaults, so it always produces a complete
3-slide deck. Hand the resulting campaign-deck.pptx back to the user.
Bundled files
The attached .zip includes:
scripts/build_campaign.py— fills the template from a JSON answers file. Run it aspython scripts/build_campaign.py <answers.json> [output.pptx].assets/campaign-template.pptx— the 3-slide, highly visual template with{{PLACEHOLDER}}tokens.assets/answers.example.json— a complete sample brand you can copy and edit.references/design-notes.md— the slide/placeholder map and theming notes.
Requires python-pptx (pip install python-pptx).
Tone
Bold, upbeat, and brand-forward. The deck should feel like a launch, not a memo. Keep copy punchy — headlines over paragraphs.
Run this — do not improvise
This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as campaign_deck_builder_agent.py and embedded as the fenced Python below (sha256 0958cdbcff97aeba…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to campaign_deck_builder_agent.py first:
python3 campaign_deck_builder_agent.py '{"key": "value"}' # arguments as one JSON object
echo '{"key": "value"}' | python3 campaign_deck_builder_agent.py # or on stdin
python3 campaign_deck_builder_agent.py --tool # emit the JSON tool contract
Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns steps, execute those steps in order exactly as returned; if it returns instructions, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent.
"""CampaignDeckBuilder -- Use this skill whenever the user wants to create a marketing-campaign presentation, pitch deck, or launch deck for a brand. Ask the campaign questions, then run the bundled script to fill the template into a finished .pptx.
Generated by the rapp skill from campaign-deck-builder. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""
import json
import re
import sys
try:
from agents.basic_agent import BasicAgent
except ImportError: # running OUTSIDE a brainstem -- stay executable anyway.
class BasicAgent: # noqa: D101 - minimal stand-in, same contract
def __init__(self, name=None, metadata=None):
if name:
self.name = name
if metadata:
self.metadata = metadata
def perform(self, **kwargs):
return "Not implemented."
def system_context(self):
return None
def to_tool(self):
return {"type": "function", "function": {
"name": self.name,
"description": self.metadata.get("description", ""),
"parameters": self.metadata.get("parameters", {})}}
# The procedural layer, verbatim from the source capability.
INSTRUCTIONS = 'Turn a short interview into a charming, vibrant, highly visual **3-slide\nnew-marketing-campaign deck** by filling a bundled PowerPoint template with a\nbundled Python script.\n\n## Step 1 — Interview the user\nAsk for these (accept short answers; anything they skip gets a tasteful\ndefault). Ask them in a single, friendly batch:\n\n1. **Brand name**\n2. **Campaign name** (the headline of the launch)\n3. **Tagline** — one line that makes people lean in\n4. **Target audience** — who it's for\n5. **The big idea** — the single concept the campaign turns on (one sentence)\n6. **Three key messages / benefits** (exactly three)\n7. **Channels / activation** — where it runs (e.g. TikTok, out-of-home, retail)\n8. **Call to action** — the ask\n9. **Closing line** — the sign-off\n10. **Brand accent color** (optional, `#RRGGBB`) — themes the whole deck\n\n## Step 2 — Write the answers file\nSave the answers as JSON. All keys are optional; `messages` is a list of three.\n\n```json\n{\n "brand_name": "Vela",\n "campaign_name": "Taste the Quiet",\n "tagline": "Botanical sparkling water for your loudest days.",\n "audience": "calm-seeking millennials",\n "big_idea": "A moment of quiet in every can.",\n "messages": ["Zero sugar, all serenity", "Adaptogens that work", "Guilt-free fizz"],\n "channels": "TikTok · Out-of-home · Sampling",\n "cta": "Pop the quiet.",\n "closing": "Vela — find your fizz.",\n "accent_hex": "#00A6A6"\n}\n```\n\nSee `assets/answers.example.json` for a complete example.\n\n## Step 3 — Build the deck\nRun the bundled script to produce the finished presentation:\n\n```bash\npython scripts/build_campaign.py answers.json campaign-deck.pptx\n```\n\nIt fills `assets/campaign-template.pptx` — replacing every `{{PLACEHOLDER}}`\nwhile preserving the design, rendering the three key messages as visual cards,\nand recoloring the deck to the brand accent color when one is given. Missing\nanswers fall back to sensible defaults, so it always produces a complete\n3-slide deck. Hand the resulting `campaign-deck.pptx` back to the user.\n\n## Bundled files\nThe attached `.zip` includes:\n- `scripts/build_campaign.py` — fills the template from a JSON answers file.\n Run it as `python scripts/build_campaign.py <answers.json> [output.pptx]`.\n- `assets/campaign-template.pptx` — the 3-slide, highly visual template with\n `{{PLACEHOLDER}}` tokens.\n- `assets/answers.example.json` — a complete sample brand you can copy and edit.\n- `references/design-notes.md` — the slide/placeholder map and theming notes.\n\nRequires `python-pptx` (`pip install python-pptx`).\n\n## Tone\nBold, upbeat, and brand-forward. The deck should feel like a launch, not a memo.\nKeep copy punchy — headlines over paragraphs.'
# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = []
class CampaignDeckBuilderAgent(BasicAgent):
def __init__(self):
self.name = 'CampaignDeckBuilder'
self.metadata = {
"name": "CampaignDeckBuilder",
"description": "Use this skill whenever the user wants to create a marketing-campaign presentation, pitch deck, or launch deck for a brand. Ask the campaign questions, then run the bundled script to fill the template into a finished .pptx.",
"parameters": {
"type": "object",
"properties": {},
"required": []
}
}
super().__init__(name=self.name, metadata=self.metadata)
def perform(self, **kwargs): # toaster:generated-perform
return json.dumps({"status": "ok", "instructions": INSTRUCTIONS,
"inputs": kwargs,
"note": "Prose-only capability: follow INSTRUCTIONS "
"with the given inputs."}, indent=2)
if __name__ == "__main__":
# echo '{"arg": "value"}' | python3 campaign_deck_builder_agent.py
# python3 campaign_deck_builder_agent.py '{"arg": "value"}'
# python3 campaign_deck_builder_agent.py --tool # emit the JSON tool contract
_a = sys.argv[1:]
if _a and _a[0] == "--tool":
print(json.dumps(CampaignDeckBuilderAgent().to_tool(), indent=2))
else:
_raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
print(CampaignDeckBuilderAgent().perform(**json.loads(_raw)))
# rci-capsule:v1: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