Agent skill
tiktok-script-generator
Generates 3 TikTok short video scripts (40–50s UGC ad style) in German with MANDATORY Chinese translation, plus a bilingual Campaign Summary. Uses official ElevenLabs v3 audio tags (every line MUST have 1-2 cues). References pre-existing analysis files (does NOT duplicate content). Outputs Obsidian-ready notes to product_list/YYYYMMDD/{product_id}/scripts/ with required frontmatter and sections. OPTIMIZED with batched Write calls.
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/data/tiktok-script-generator
SKILL.md
TikTok Script Generator Skill v2.3
PURPOSE: Generate production-ready UGC TikTok ad scripts with official ElevenLabs v3 audio tags (German VO + mandatory Chinese translation)
EXECUTOR: Claude Code (for quality creative writing)
INPUT: Analysis files from tiktok-product-analysis skill
OUTPUT: 3 scripts + Campaign Summary (references analysis, no duplication)
STYLE: Fast-paced UGC ads with mandatory emotion cues (1-2 per line), engaging delivery, dynamic performance
OPTIMIZATION: Batched Write calls (4 files per product in single message) ⭐ 2x faster
⚠️ CRITICAL FORMAT RULE - READ THIS FIRST:
- INLINE CUES ONLY:
[emotion] Text here.(cue + text on SAME LINE) - NEVER BROKEN LINES: Do NOT write
[emotion]on one line followed by text on the next line - EVERY LINE NEEDS CUES: No orphan text without emotion tags
- See
templates/voiceover_format.mdfor complete format specification
Agent Responsibility
| Task | Agent | Why |
|---|---|---|
| Image/Video Analysis | Gemini MCP | Parallel processing, token-efficient |
| Script Writing | Claude Code | Better creative quality, detailed storyboards |
| Campaign Summary | Claude Code | Executive synthesis, proper references |
Key Lesson: Gemini produces generic placeholder scripts. Claude produces detailed, product-specific content with natural voiceovers.
Workflow (4 Steps - OPTIMIZED)
[Step 0: Pre-Check] → GATE
│
▼
[Step 1: Read Analysis Files in Parallel] → Extract key insights
│ (5+ Read calls at once)
▼
[Step 2: Generate All Scripts + Summary] → Create all 4 files
│ (in single response)
▼
[Step 3: Write All Files in Parallel] → 4 Write calls simultaneously
│ ⭐ 2x faster
▼
[Step 4: Quality Gate] → Verify completeness
Key Optimization (v2.3.0): Steps 2-3 now execute in ONE MESSAGE with parallel Write tool calls, eliminating sequential overhead.
Step 0: Pre-Check Gate (MANDATORY)
DO NOT PROCEED if analysis files are missing.
product_id="{product_id}"
# Use the correct dated batch folder:
date="YYYYMMDD"
base="product_list/$date/$product_id"
echo "=== PRE-CHECK: $product_id ==="
# MANDATORY: Video synthesis must exist
if [ ! -f "$base/ref_video/video_synthesis.md" ]; then
echo "❌ BLOCKED: video_synthesis.md missing"
echo "Run tiktok-product-analysis skill first"
exit 1
fi
lines=$(wc -l < "$base/ref_video/video_synthesis.md" | tr -d ' ')
if [ "$lines" -lt 150 ]; then
echo "❌ BLOCKED: video_synthesis.md too short ($lines lines, need 150+)"
exit 1
fi
# CRITICAL: Verify synthesis has properly flagged compliance risks
echo "Checking compliance flagging in analysis..."
if ! python3 scripts/validate_compliance_flags.py "$base/ref_video/video_synthesis.md" >/dev/null 2>&1; then
echo "⚠️ WARNING: video_synthesis.md has compliance risks not properly flagged"
echo " Review and ensure risks are documented in 'Compliance & Trust Signals' section"
echo " Run: python3 scripts/validate_compliance_flags.py \"$base/ref_video/video_synthesis.md\""
# Don't block, but warn - analysis files can have flagged risks
fi
echo "✅ Pre-check passed. Ready for script generation."
If blocked: Run tiktok-product-analysis skill first.
Recommended (Repo Verifier)
bash scripts/verify_gate.sh --date YYYYMMDD --csv scripts/products.csv --phase analysis
Step 1: Read Analysis Files (PARALLEL v2.3.0)
CRITICAL OPTIMIZATION: Use parallel Read tool calls to fetch ALL files in ONE MESSAGE.
Files to read (make 4-5 parallel Read calls):
-
ref_video/video_synthesis.md(CRITICAL)- Hook patterns, selling points, replication strategy
- Target audience, production patterns
- DO's and DON'Ts
-
product_images/image_analysis.md(if exists)- Visual hooks (Section 10)
- German text from packaging
- Color/variant recommendations
-
tabcut_data.json(product metadata)- Product name, price, shop
- Sales data, conversion rate
-
fastmoss_data.json(fallback if tabcut data is missing/unknown)- Use if product_name is "Unknown Product" or key sales metrics are null
-
Individual
video_N_analysis.mdfiles (optional, for deep dive)- Use if video_synthesis.md lacks detail
Example parallel execution:
<Read file_path="product_list/YYYYMMDD/{product_id}/ref_video/video_synthesis.md" />
<Read file_path="product_list/YYYYMMDD/{product_id}/product_images/image_analysis.md" />
<Read file_path="product_list/YYYYMMDD/{product_id}/tabcut_data.json" />
All 3 files read simultaneously in ~2-3 seconds (was 6-9 seconds sequential).
Extract these key elements:
- Top 3 hook patterns from synthesis
- Top 5 selling points (ranked)
- 3 recommended script angles
- German terminology from packaging
- Visual filming instructions
Step 2-3: Generate and Write All Scripts (BATCHED v2.3.0)
CRITICAL OPTIMIZATION: Generate all 3 scripts + Campaign Summary in ONE response, then make 4 parallel Write tool calls.
Old workflow (sequential - SLOW):
Generate Script 1 → Write Script 1 → Generate Script 2 → Write Script 2 → Generate Script 3 → Write Script 3 → Generate Summary → Write Summary
Total: ~5-8 minutes per product
New workflow (batched - FAST):
Generate all 4 files (Scripts 1-3 + Summary) → Write all 4 in parallel
Total: ~2-3 minutes per product ⭐ 2x faster
Implementation:
- After reading analysis files, generate complete content for all 4 files
- In a SINGLE MESSAGE, make 4 Write tool calls in parallel:
- Write Script 1
- Write Script 2
- Write Script 3
- Write Campaign Summary
Each script must have:
Required YAML Frontmatter (Obsidian)
See templates/frontmatter_template.md for complete specification.
Quick reference:
durationtarget: 00:40–00:50tagsmax 5 and meaningful for commerce/interestcaptionuses YAML block scalarcaption: >-with hashtags appended (space-separated)- Always include
source_notesto exact files used
TikTok Policy Compliance (DE Market) - ENHANCED v2.0
CRITICAL: These rules prevent TikTok ad rejection and "false advertising" complaints in the German market. All scripts MUST pass compliance validation before publication.
POLICY 1: No Exact Low Price Bait 🚫
Prohibited: Specific € amounts combined with urgency, comparison, or scarcity framing.
| ❌ VIOLATION | ✅ COMPLIANT ALTERNATIVE |
|---|---|
| "Nur 9€!" | "Super günstig!" / "Tolles Preis-Leistungs-Verhältnis" |
| "€9.99 statt €50" | "Fraktioniert vom Markenpreis" / "Für kleines Geld" |
| "Nur noch 3 Stück!" | "Jetzt verfügbar" / "Schnell bestellen" |
| "Warum 150€ zahlen?" | "Markengeräte oft teurer" / "Ohne Aufpreis" |
| "50% Rabatt" | "Top Angebot" / "Aktionspreis" |
| "Jetzt nur €29,99" | "Aktuell besonders günstig" |
Safe Price Language:
- German:
"preiswert","erschwinglich","für kleines Geld","fairer Preis","gutes Preis-Leistungs-Verhältnis" - Chinese:
"价格很友好","很划算","性价比高","不贵"
Rule: Avoid exact €, comparison math ("statt/vs"), or urgency tied to price.
POLICY 2: No Absolute Effect Claims 🚫
Prohibited: "100%", "pure", "perfect", "genauso gut", "never", "always", "instant" without qualification.
| ❌ VIOLATION | ✅ COMPLIANT ALTERNATIVE |
|---|---|
| "100% wasserdicht" | "Wasserabweisend" / "Spritzwassergeschützt" |
| "Pure Freude" | "Richtig schön" / "Tolles Gefühl" |
| "Perfektes Geschenk" | "Schöne Geschenkidee" / "Praktisches Geschenk" |
| "Genauso gut wie [Brand]" | "Vergleichbare Qualität" / "Gute Alternative" |
| "Besser als [Brand]" | "Stark genug" / "Für [use case] geeignet" |
| "Nie wieder [problem]" | "Reduziert [problem]" / "Hilft bei [problem]" |
| "Sofort [result]" | "Schnell [result]" / "In kürzester Zeit" |
| "Komplett schützt" | "Bietet Schutz" / "Schützt vor [specific]" |
Safe Comparison Language:
- German:
"hilft bei","unterstützt","kann","für... geeignet","stark genug" - Chinese:
"有助于","支持","适合","功能强大","能满足需求"
Rule: Use qualified claims with "hilft bei", "unterstützt", or specific context instead of absolutes.
POLICY 3: No Exaggerated Promotions 🚫
Prohibited: Unverifiable superlatives, false urgency, hyperbolic claims without proof.
| ❌ VIOLATION | ✅ COMPLIANT ALTERNATIVE |
|---|---|
| "Unbezahlbar!" | "Unersetzlich" / "Wertvoll" / "Besonders" |
| "Genial!" | "Clevere Lösung" / "Praktisch" / "Wirklich gut" |
| "Unglaublich!" | "Beeindruckend" / "Überzeugend" |
| "Bevor es weg ist!" | "Mehr entdecken" / "Jetzt bestellen" |
| "Letzte Chance!" | "Verfügbar" / "Aktuell auf Lager" |
| "Nur noch 3 Stück!" | "Guter Lagerbestand" / "Jetzt verfügbar" |
| "Sie müssen das haben!" | "Lohnt sich" / "Praktisch für" |
| "Das beste Produkt!" | "Eine gute Wahl" / "Empfehlenswert" |
| "100% empfohlen" | "Wir empfehlen" / "Top Bewertungen" |
Safe Promotion Language:
- German:
"praktisch","clever","hilfreich","empfehlenswert","wertvoll","besonders" - Chinese:
"实用","方便","值得推荐","有价值","特别"
Rule: Avoid hyperboles without proof. Use descriptive, specific benefits instead.
POLICY 4: Medical & Health Claims 🚫
Prohibited: Therapy, healing, pain relief, medical treatment framing.
| ❌ VIOLATION | ✅ COMPLIANT ALTERNATIVE |
|---|---|
| "Heilt [condition]" | "Unterstützt bei [condition]" / "Hilft bei [condition]" |
| "Schmerzlinderung" | "Entspannung" / "Wohlbefinden" / "Angenehm" |
| "Schmerzfreiheit" | "Lindert" / "Besseres Gefühl" |
| "Physiotherapie" | "Massage-Funktion" / "Entspannungsmodus" |
| "Tiefengewebe-Behandlung" | "Intensive Massage" / "Tiefe Entspannung" |
| "Medizinisch bewährt" | "Beliebt bei" / "Viele nutzen" |
Safe Wellness Language:
- German:
"Entspannung","Wohlbefinden","lockert Verspannungen","angenehm","komfortabel","entspannend" - Chinese:
"放松","舒适","缓解紧绷感","享受"
Rule: Never promise medical outcomes. Use wellness/comfort framing only.
POLICY 5: Waterproof & Tech Specs 🚫
Prohibited: Absolutes without IP rating proof, ambiguous tech claims.
| ❌ VIOLATION | ✅ COMPLIANT ALTERNATIVE |
|---|---|
| "100% wasserdicht" | "Spritzwassergeschützt" (IPX4) / "Wasserabweisend" |
| "Komplett wasserdicht" | "Für Regen geeignet" / "Schützt vor Spritzwasser" |
| "4K Support" (ambiguous) | "Unterstützt 4K Dekodierung" / "4K-kompatibel" |
| "Zero Lag" / "Keine Verzögerung" | "Flüssige Wiedergabe" / "Schnelle Reaktion" |
| "Instant [result]" | "Schnell [result]" / "Kurze Ladezeit" |
Safe Tech Language:
- Waterproof: Use IP rating ONLY if sourced (e.g., "IP67" from packaging)
- Performance: Use qualified terms ("flüssig", "schnell", "zuverlässig")
- Avoid: "instant", "zero", "100%", "komplett", "total"
Compliance Validation Checklist
Before finalizing scripts, verify:
# Run compliance validator on generated scripts
for script in product_list/YYYYMMDD/{product_id}/scripts/*.md; do
[[ "$(basename "$script")" == "Campaign_Summary.md" ]] && continue
python3 scripts/validate_compliance_flags.py "$script"
done
Manual Review Points:
- No € symbols in captions or voiceovers
- No "100%", "pure", "perfect", "genauso gut", "besser als"
- No "unbezahlbar", "genial", false urgency ("weg ist", "letzte Chance")
- Medical terms replaced with wellness language
- Tech specs qualified (not absolute)
If validation fails:
- Check the specific violation flagged
- Find the compliant alternative in the table above
- Replace and re-validate
- Never bypass compliance checks
Required Sections
## Scripts
[1–2 sentence concept description]
### Structure (35s)
- Hook: [Description] (0-3s)
- Problem/Reveal: [Description] (3-8s)
- Solution/Demo: [Description] (8-20s)
- Benefits: [Description] (20-30s)
- CTA: [Description] (30-35s)
### Visual Strategy - ENHANCED TEMPLATE
**Required format:** Seconds | Visual | Purpose (psychological function)
**Sample-quality example:**
| Seconds | Visual | Purpose |
|:--------|:-------|:--------|
| 00-03 | Screenshot of negative comment: "Breaks after 1 day" with creator looking annoyed | Hook: Relatable objection creates curiosity |
| 03-07 | Hands dropping LARGE ice cubes + frozen berries into transparent cup | Build tension: "Can it really handle this?" |
| 07-10 | Close-up: LED display showing battery at 95% before starting | Trust: Tech credibility with real data |
| 10-15 | Blender upside down, ice crushing visible through transparent cup | Proof: Visual confirmation of power |
| 20-25 | Final smoothie texture shot (creamy, no chunks) | Result proof: Delivers on promise |
**Purpose categories (choose 1 per shot):**
- **Hook:** Attention/Relatability/Pattern Interrupt
- **Problem:** Pain amplification/Anchoring
- **Proof:** Evidence/Trust building/Demonstration
- **Objection Handling:** Removes barrier (noise, battery, cleaning)
- **Social Proof:** FOMO/Aspiration
- **Conversion:** CTA/Urgency
**Minimum:** 8-10 shots for 40-50s, each with clear psychological purpose
Voiceover Sections
See templates/voiceover_format.md for complete specification and all audio tags.
Critical requirements:
- INLINE cues:
[emotion] Text.on SAME LINE - 1-2 audio tags per line (MANDATORY)
- Both German (DE) and Chinese (ZH) sections required
- Target length: 40-50s (100-150 German words, 130-180 Chinese characters)
Script Naming Convention
Product_Model_KeyAngle.md # e.g., HTC_NE20_AI_Uebersetzer_Earbuds.md
Campaign Summary (Reference-Based - Included in Step 2-3)
See templates/campaign_summary_structure.md for complete template.
Key Change from v1: DO NOT duplicate content from analysis files. REFERENCE them.
MANDATORY: Use inline Chinese throughout (English text (中文翻译))
Required sections:
- Product Overview | 产品概述
- Campaign Strategy | 活动策略
- Key Selling Points | 核心卖点
- Target Audience | 目标受众
- Scripts Summary | 脚本摘要
- Production Notes | 制作说明
- Source Files | 源文件
Step 4: Quality Gate (Post-Write Validation)
product_id="{product_id}"
date="YYYYMMDD"
scripts_dir="product_list/$date/$product_id/scripts"
echo "=== QUALITY GATE: $product_id ==="
# Check script count (exclude Campaign_Summary.md)
script_count=$(ls -1 "$scripts_dir"/*.md 2>/dev/null | grep -v 'Campaign_Summary.md' | wc -l | tr -d ' ')
if [ "$script_count" -lt 3 ]; then
echo "❌ FAIL: Only $script_count scripts (need 3)"
exit 1
fi
echo "✅ Scripts: $script_count"
# Check Campaign Summary
if [ ! -f "$scripts_dir/Campaign_Summary.md" ]; then
echo "❌ FAIL: Campaign_Summary.md missing"
exit 1
fi
echo "✅ Campaign Summary exists"
# Check script quality (not stubs)
for script in "$scripts_dir"/*.md; do
if [ "$(basename "$script")" = "Campaign_Summary.md" ]; then
continue
fi
lines=$(wc -l < "$script" | tr -d ' ')
if [ "$lines" -lt 40 ]; then
echo "⚠️ WARNING: $(basename $script) may be a stub ($lines lines)"
fi
# Check for placeholder content
if grep -q 'product: "Product"' "$script"; then
echo "❌ FAIL: $(basename $script) has placeholder product name"
exit 1
fi
if ! grep -q '### ZH' "$script"; then
echo "❌ FAIL: $(basename $script) missing Chinese translation section"
exit 1
fi
# Caption should use YAML block scalar so hashtags don't break YAML parsing
if ! awk 'BEGIN{in=0} /^---$/{in=!in} in && /^caption: >-/{ok=1} END{exit !ok}' "$script"; then
echo "⚠️ WARNING: $(basename $script) caption is not using 'caption: >-' (hashtags may break YAML)"
fi
done
echo "✅ Script quality verified"
# CRITICAL: TikTok Policy Compliance Validation
echo ""
echo "=== TIKTOK POLICY COMPLIANCE CHECK ==="
echo "Validating scripts against TikTok advertising policies..."
compliance_fail=0
for script in "$scripts_dir"/*.md; do
[[ "$(basename "$script")" == "Campaign_Summary.md" ]] && continue
[[ -e "$script" ]] || continue
if ! python3 scripts/validate_compliance_flags.py "$script" >/dev/null 2>&1; then
echo "❌ FAIL: $(basename "$script") has compliance violations"
echo " Run: python3 scripts/validate_compliance_flags.py \"$script\""
compliance_fail=1
fi
done
if [ "$compliance_fail" -eq 1 ]; then
echo ""
echo "⚠️ COMPLIANCE VIOLATIONS DETECTED"
echo "Fix violations before proceeding. See 'TikTok Policy Compliance' section for safe alternatives."
exit 1
fi
echo "✅ All scripts pass TikTok policy compliance"
echo ""
echo "=== QUALITY GATE PASSED ==="
Batch Processing (v2.3.0 Optimized)
For multiple products, process sequentially with batched writes:
Product A: [Read all files in parallel] → [Generate + Write 4 files in parallel] → [Gate] = 2-3 min
Product B: [Read all files in parallel] → [Generate + Write 4 files in parallel] → [Gate] = 2-3 min
Product C: [Read all files in parallel] → [Generate + Write 4 files in parallel] → [Gate] = 2-3 min
Performance Improvement:
- Old (sequential writes): 5-8 min per product × 8 products = 40-64 min
- New (batched writes): 2-3 min per product × 8 products = 16-24 min
- Savings: ~25-40 minutes for 8-product batch ⭐ 2x faster
Why sequential across products (not parallel)?
- Claude Code produces better quality with focused attention
- Each product needs full context window for analysis
- Quality over speed for creative content
- BUT: We optimize WITHIN each product via batched writes
Time estimate (v2.3.0): ~2-3 minutes per product for script generation
Common Mistakes to Avoid
❌ Mistake 1: BROKEN LINE FORMAT (Most Common Error)
Symptoms: Writing emotion cues on separate lines from text
[frustrated]
Du kennst das?
Why it fails: Validation script expects [cue] Text. on SAME LINE. Separate lines create "orphan" text without cues.
Fix: ALWAYS write inline: [frustrated] Du kennst das?
Validation Error: "Low cue density" / "No German voiceover section found"
❌ Mistake 2: Starting before analysis complete
Fix: Always run Step 0 Pre-Check first
❌ Mistake 3: Generic placeholder content
Symptoms: "You won't believe...", product="Product" Fix: Read analysis files, use specific product details
❌ Mistake 4: Duplicating analysis content in Campaign Summary
Fix: Reference files with quotes, don't copy-paste
❌ Mistake 5: Missing ElevenLabs v3 markers
Fix: Every VO line needs [tone] marker at start (inline format)
❌ Mistake 6: Skipping Chinese translations
Fix: Chinese translation is mandatory for every script (DE + ZH sections required)
File Structure After Completion
product_list/YYYYMMDD/{product_id}/
├── tabcut_data.json # From scraper
├── product_images/
│ ├── *.webp
│ └── image_analysis.md # From analysis skill
├── ref_video/
│ ├── video_*.mp4
│ ├── video_*_analysis.md # From analysis skill
│ └── video_synthesis.md # From analysis skill (CRITICAL)
└── scripts/ # FROM THIS SKILL (new workflow)
├── Product_Model_KeyAngle.md
├── Product_Model_KeyAngle.md
├── Product_Model_KeyAngle.md
└── Campaign_Summary.md
Integration with Other Skills
Workflow order:
tiktok-product-scraper→ Product data + videostiktok-product-analysis→ Image + video analysis (Gemini)tiktok-script-generator→ Scripts + summary (THIS SKILL - Claude)
Handoff verification:
# Before running this skill, verify:
date="YYYYMMDD"
ls product_list/$date/$product_id/ref_video/video_synthesis.md # Must exist
Version: 2.3.0 Last Updated: 2026-01-31 Changes from v2.2:
- MAJOR PERFORMANCE OPTIMIZATION: Batched Write calls ⭐ 2x faster
- Parallel Read tool calls (all analysis files fetched at once)
- Parallel Write tool calls (4 files written simultaneously in one message)
- Workflow reduced from 5 steps to 4 steps (Steps 2-3 merged)
- Time per product: 2-3 min (was 5-8 min)
- 8 products: 16-24 min (was 40-64 min)
- Template extraction: Moved frontmatter, voiceover format, and campaign summary to separate template files
- Added template references throughout skill for better maintainability
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?