Communitygithub.com

Finderchangchang/promo-video-skill

Créez facilement des vidéos promotionnelles verticales soignées avec LLM à moindre coût, adaptées aux secteurs du logiciel, alimentaire, e-commerce, éducation, beauté et voyage, en chinois ou anglais.

Qu'est-ce que promo-video-skill ?

Ce skill permet de générer des vidéos promotionnelles verticales de qualité, destinées aux réseaux sociaux, en s'appuyant sur un LLM pour choisir les plans et remplir le contenu textuel, sans écrire une ligne de code. Il est conçu pour les développeurs, les marketeurs ou les créateurs de contenu souhaitant produire rapidement des publicités vidéo courtes pour des produits ou services. Le skill prend en charge six secteurs d'activité (logiciel, alimentation, e-commerce, éducation, beauté, voyage) et deux langues (chinois, anglais). Le processus se déroule en étapes claires : définir le secteur et la langue (en lisant le guide spécifique au secteur), collecter les informations clés via un brief utilisateur, sélectionner un thème visuel, choisir 5 à 9 plans d'une bibliothèque de 18 types (hook, démonstration, comparaison, etc.) en respectant des règles strictes de cohérence et de conformité, puis rédiger les sous-titres percutants. Le système valide automatiquement le storyboard complet (JSON) pour détecter les erreurs de contenu, de logique et les violations des règles publicitaires avant de générer la vidéo finale via Remotion. La sortie inclut la vidéo MP4, un planche contact, un rapport de vérification et les fichiers de rendu intermédiaires.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add Finderchangchang/promo-video-skill

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Productiepromovideo (promo-video)

Je fais uniquement deux choses : choisir les plans et remplir le texte. Pas de code, pas de modification des fichiers dans template/, scripts/, industries/, pas de coordonnées, de trames ou de valeurs de couleur.

Ci-dessous <SKILL> = le répertoire de ce fichier. Exécutez les commandes avec Node 22 / Python 3.10. Pour un utilisateur anglophone ou une vidéo en anglais → lisez <SKILL>/SKILL.en.md plutôt.

Procédure

  1. Définir le secteur et la langue.
    • meta.industry : software (par défaut) / food (restauration) / ecommerce (commerce physique) / education (formation) / beauty (esthétique) / travel (tourisme et hébergement). Si le secteur est mal choisi, les plans disponibles et les règles de conformité seront erronés.
    • meta.lang : zh (par défaut) / en. Si la vidéo doit avoir des sous-titres en anglais et que l'utilisateur est anglophone, définir en (voir l'étape 5).
    • Si le secteur n'est pas software → lire d'abord <SKILL>/industries/<industry>/recipe.md (pour les projets anglais lire recipe.en.md) : il contient les combinaisons de plans recommandées pour ce secteur, brief-template.md (les questions à poser dans le brief), test-brief.md/expected.md (exemples de violations de conformité). Ignorer cette étape expose à un contenu bloqué.
  2. Lire le brief. Comprendre les sections du brief-template.md correspondant ; si les informations suivantes manquent, les demander d'abord, ne pas inventer de données ou de fonctionnalités : nom du produit, argument de vente en une phrase, scénario de douleur, action clé, 2–4 arguments de vente.
    • meta.product reprend exactement le nom du produit du brief. Il sera utilisé dans tout le film (accroche, fin). Le brand de la fin doit être strictement identique.
    • meta.action : obligatoire, une phrase du type « l'utilisateur fait X → le produit donne Y » (ex : « prend une photo du ticket → remplit automatiquement le montant et la catégorie »), sans montrer l'écran. Le texte des plans de démonstration (chat, phone, mockApp, photoShot) doit refléter cette action ; la validation le vérifiera.
    • Si le brief contient un « moyen d'obtention », le reporter textuellement dans meta.cta ; le cta de la fin le reprend. Si le brief indique « aucun », ne pas écrire de cta. Ne pas inventer de mentions comme « Téléchargez sur l'App Store ».
    • Ne pas mentionner dans l'argumentaire ou la fin des fonctionnalités absentes du brief.
    • Si le brief contient des « chiffres et sources », les copier un par un dans meta.facts au format [{"id":"f1","text":"Citation originale…"}] (et non un simple tableau de chaînes). Tout chiffre avec une unité (durée, pourcentage, multiple, nombre de personnes, montant) à l'écran doit provenir de cette même source ; sans source, c'est une erreur, pas un simple avertissement. Si aucune donnée n'est fournie, utiliser des formulations qualitatives, ne pas inventer de chiffres. Le champ params.refs : ["f1"] d'un plan permet d'associer une phrase (ex : « fait maison ») à un fait pour la vérification sectorielle.
    • Une seule durée pour la même action dans tout le film : si le compteur indique 3 minutes, nulle part ailleurs on ne doit trouver « en quelques secondes » ou « 3 secondes » ; si l'accroche dit « une demi-journée », l'ancienne valeur du compteur doit aussi être une demi-journée. La validation le bloquera. De même, dans un plan compare, les stat et items d'une même colonne ne doivent pas se contredire.
    • Pour modifier la plage de durée par défaut (15–45 secondes), utiliser meta.durationRange : [15, 60] (tableau à deux éléments).
    • Si un petit texte constant en bas est nécessaire (ex : « Offre à durée limitée, consultez les détails de l'offre groupée »), utiliser meta.notices : tableau de chaînes, maximum 3, affichées en une seule ligne en bas.
  3. Créer le répertoire : promo/<nom_anglais_du_film>/ et écrire le storyboard dans promo/<nom_anglais_du_film>/storyboard.json. Copier les captures d'écran, enregistrements d'écran ou logos fournis par l'utilisateur dans le même répertoire.
  4. Choisir le thème (meta.theme) :
    • Émotion, social, vie quotidienne → warm-emotion
    • Développeur, IA, outils techniques → tech-dark
    • Santé, apprentissage, comptabilité, outils légers → fresh-light
    • Bureau, B2B, productivité → business-blue
    • Fêtes, promotions, nouveautés → festival-red
    • Haut de gamme, minimalisme, design → mono-premium Si une couleur de marque existe, définir meta.brandColor (#RRGGBB) ; elle ne changera que la couleur d'accent.
  5. Choisir 5 à 9 plans (description des plans dans <SKILL>/shots.md, tableau récapitulatif des 18 plans en haut). hook doit être le premier plan (2–3 secondes), endCard doit être le dernier (4 secondes). Un plan doit absolument démontrer l'action clé (écrite à l'étape 2 dans meta.action) ; la validation le vérifiera :
    • chat : messages + panel (question → réponse) ; ou mockApp : input (saisie/ question de l'utilisateur) + résultat (stat du dashboard, items de l'editor, done) ; si une capture d'écran existe, utiliser phone. meta.industry détermine les plans autorisés (voir industries/<industry>/rules.json pour enabledShots, ou le recipe.md). Utiliser un plan non autorisé provoquera une erreur de validation. Les 7 plans sectoriels (non activés par défaut pour software) :
    • photoShot : photo/vidéo réelle (plat, produit, œuvre, chambre, espace commun, cuisine)
    • priceCard : carte de prix ; storeCard : carte boutique/carte/ réservation ; reviewCard : avis client réel (citation textuelle, ne pas exagérer)
    • factSheet : fiche technique / liste de déballage / syllabus / informations d'examen / nuancier ; credCard : carte de diplôme/d'honneur
    • beforeAfter : curseur before/after (réservé à l'esthétique, nécessite consent:true + retouched:false) Choisir les plans en fonction du type de produit, ne pas utiliser un modèle fixe. Les features ne sont pas obligatoires. Deux exigences strictes (la validation le rappelle) :
    • Au moins un plan du milieu provient de {compare, steps, phone, meter} ;
    • quickList et counter ne sont pas utilisés ensemble (sinon le film devient hook → quickList → mockApp → counter → endCard, un modèle identique pour tout le monde). Pour le secteur software, combinaisons possibles (en choisir une et l'adapter au produit ; pour les autres secteurs, suivre les structures recommandées dans industries/<industry>/recipe.md) :
    • B2C émotion/social (chat, émotion, compagnie) : hook(bubble) → chat (démonstration, 2–3 répliques) → meter ou compare (l'impact de ces mots) → quickList → endCard
    • Outil de productivité (écriture, comptabilité, publication, montage) : hook(stat) → compare (avant vs maintenant) → mockApp editor/form (démonstration « saisie → résultat ») → steps (mode d'emploi) → endCard ; ou hook → quickList (les problèmes) → mockApp → steps → endCard
    • B2B données/bureau (rapports, réunions, CRM) : hook(icon) → phone (capture d'écran annotée) ou mockApp dashboard avec input (« une question → des données ») → compare ou meter (résultats) → steps → endCard ; utiliser counter seulement si le brief donne une durée chiffrée (dans ce cas, pas de quickList) Durée totale idéale : 20–30 secondes (tolérance 15–45, ou la plage meta.durationRange). Ne pas utiliser deux fois le même plan consécutif. La différence de mood entre deux plans consécutifs ne doit pas dépasser 0.5 (sinon le fond changera brutalement).
  6. Rédiger les sous-titres (caption de chaque plan) : une phrase par plan, en gros caractères (style Douyin), adressée au public, pas une description de l'animation (❌ « Les cartes apparaissent une par une, expliquant ce qu'il peut faire » est une description de plan, pas un sous-titre).
    • En chinois : maximum 2 lignes, avec saut de ligne \n ; chaque ligne ≤12 caractères chinois (lettres et chiffres comptent pour un demi-caractère). En anglais (meta.lang: "en"), les sous-titres sont ajustés selon le nombre de caractères latins (environ 1,8 fois la limite chinoise) ; voir les détails dans docs/shots/<type>.en.md
    • Utiliser {} pour encadrer les 2 à 5 mots les plus importants, qui prendront une couleur d'accent ; maximum 1 occurrence par sous-titre
    • Le caption de hook = titre de couverture, écrit sous forme de problème ou de question contre-intuitive
    • endCard n'a pas de caption ; le slogan est écrit dans params.slogan
    • Un sous-titre reste à l'écran au maximum 5 secondes. Pour les plans plus longs (ex : 8–10 secondes pour chat), le caption est un tableau de 2–3 phrases, chaque phrase occupant une partie égale du temps : "caption": ["Ne te précipite pas pour envoyer, \nce dont l'autre a besoin c'est de {ton attention}", "Choisis-en une et écris-la dans le champ, \nà toi de décider {si tu l'envoies}"]
    • Le sous-titre doit parler de la situation de l'utilisateur ou du changement apporté par le produit, et être cohérent avec le plan précédent et suivant ; la façon dont l'écran bouge est gérée par le composant, inutile de l'écrire. Les mots entre « » dans le sous-titre doivent être apparus dans ce plan ou dans un plan précédent (la validation le vérifie)
    • Si le sous-titre mentionne une quantité (« ces 4 phrases », « trois réponses »), elle doit correspondre au nombre d'éléments dans ce plan (la validation le vérifie)
    • Éviter les phrases toutes faites (« trois choses, {elle…} », « ces trois étapes », « ces moments, tu les as aussi… »), ne pas copier les sous-titres et paramètres des exemples, shots.md, ou spec ; la validation le signalera et proposera une phrase type à remplir. Les exemples ne sont que pour le format.
    • Pas de répétitions de mots (« emploi du temps emploi du temps »), pas de coupures de mots (« goulot d'étranglement » écrit « goulot étrangle »), pas de fautes d'orthographe (« connexion » écrit « conection »). Si le nombre de caractères est dépassé, reformuler entièrement la phrase.
    • Pas de termes absolus (« tout fait », « parfaitement clair », « sécurité totale », « 100% ») : le produit aura du mal à les tenir ; la validation le signalera. Utiliser des formulations mesurées.
    • Pour le saut de ligne, écrire \n ; pour les guillemets dans le sous-titre, utiliser « » et non des guillemets droits anglais ".
  7. Définir le mood (0–1) : douleur/tension : 0.8–1, transition : 0.5, produit et arguments : 0–0.3, fin : 0. La couleur de fond et la musique suivent cette valeur.
  8. Écrire storyboard.json, format voir l'exemple complet en fin de document. La durée est dur (en secondes), multiple de 0.5. Le fichier doit être en UTF-8. Sous Windows, l'encodage par défaut est GBK : utiliser un éditeur/script pour écrire directement en UTF-8, ou via PowerShell : [IO.File]::WriteAllText($p, $json, [Text.UTF8Encoding]::new($false)) ; via Python : open(p, "w", encoding="utf-8"). Ne pas utiliser echo > ou Out-File (version 5.1) pour écrire du chinois. Pour chat, panel.replies sont les suggestions du produit « moi » envoyées à l'autre personne ; les rédiger du point de vue de « moi » (je dis que je dois faire des heures sup, la réponse suggérée ne peut pas être « Arrête de faire des heures sup, accompagne-moi » – c'est le point de vue de l'autre). S'il y a un panel, ne pas écrire typing.
  9. Valider, corriger les erreurs une par une jusqu'à réussite :
    node <SKILL>/scripts/validate.mjs promo/<nom_du_film>/storyboard.json
    
    Le format des erreurs est « Plan N (type) champ : problème → comment corriger ». Suivre « comment corriger ». Les résultats sont en trois niveaux :
    • Erreurs : à corriger impérativement, sinon pas de rendu.
    • Avertissements : à corriger si possible (qualité du texte, structure trop proche du modèle) ; si impossible à corriger, le film peut être rendu mais il faut expliquer à l'utilisateur pourquoi.
    • Nécessite vérification humaine : la validation ne peut pas décider (ex : « cet avis est-il vraiment textuel ? », « cette qualification provient-elle vraiment du brief ? »). Ne pas modifier le storyboard, les lister tels quels à l'utilisateur pour qu'il les valide lui-même.
  10. Générer le film (environ 2 minutes, la musique de fond est automatique) :
    node <SKILL>/scripts/make.mjs promo/<nom_du_film>/storyboard.json --out promo/<nom_du_film>
    
    --out est obligatoire (en test utiliser --round <numéro_de_tour>, les fichiers iront dans tests/<numéro_de_tour>/<nom_du_film>/ ; utiliser le même numéro pour plusieurs films du même tour, ne pas générer de répertoire horodaté vous-même). Résultat : video.mp4, sheet.png (mosaïque d'images par seconde), check/ (image 0 + images plein écran avant la fin de chaque plan), report.txt (rapport de mise en page du texte : mots coupés, largeurs dépassées), layout.json. Pour un aperçu rapide de quelques images : ajouter --stills 0,3.5,8 (secondes), seul le rendu des images est fait, pas la vidéo entière.
  11. D'abord voir la fin de report.txt (« Auto-vérification », « Rapport de mise en page du texte », « Vérification de la mise en page ») – le script make.mjs le fait automatiquement : vérifie les backslashes, les noms de produit, les moyens d'obtention, la durée d'affichage des sous-titres, les icônes de fin qui chevauchent les mentions légales, les mots coupés/lignes trop larges ; il mesure la position de chaque bloc de texte pour détecter les coupures par des cartes ou des chevauchements ou si le texte sort de la zone (x : 150-930). Si des ✗ apparaissent, corriger d'abord (les ✗ de mise en page sont généralement dus à trop de texte : supprimer des éléments ou raccourcir le texte) ; ensuite regarder sheet.png et check/ avec la liste de vérification ci-dessous, puis corriger storyboard.json et revenir à l'étape 9.
  12. Livrer : donner le chemin de video.mp4, sheet.png à l'utilisateur, accompagnés de la « Liste de vérification avant publication » (ci-dessous) – inclure textuellement les éléments « Nécessite vérification humaine » de l'étape 9, point par point, pour que l'utilisateur les valide, sans juger à sa place.

Liste de vérification (regarder la mosaïque, écrire une conclusion pour chaque point, ne pas simplement cocher)

  • L'image 0 a un grand titre + visuel principal, pas vide ou à moitié ; pas de \n, de backslash ou autre caractère étrange sur la couverture
  • Chaque plan a un élément principal animé (curseur, chiffres, cartes, bulles de discussion), pas une image fixe ; pas de « zoom/dézoom d'image » pour faire nombre
  • Les sous-titres ne cachent pas le sujet, ne sont pas tronqués, pas de mots coupés (un mot coupé sur deux lignes) ; sous-titres et images racontent la même chose, l'histoire se tient d'un plan à l'autre
  • Les sous-titres s'adressent au public, ce ne sont pas des descriptions de plan (pas de phrase comme « les cartes apparaissent une par une »)
  • L'action clé est vraiment montrée (on voit « saisie/question → résultat »), pas seulement un panneau tout fait
  • La couleur de fond change avec l'émotion : douleur plutôt rouge, arguments et fin plutôt froids
  • Le nom du produit à la fin est identique à meta.product ; le moyen d'obtention est celui du brief, ou absent ; pas d'URL, pas de QR code
  • Les chiffres sont cohérents : vérifier les calculs entre les chiffres d'une comparaison (30 minutes contre 5 secondes, le verdict ne peut pas être « économise 25 minutes ») ; chaque chiffre à l'écran a une source dans meta.facts
  • Pas de fautes d'orthographe, pas de mots inventés en supprimant des caractères pour faire court ( « téléchargement automatique » écrit « tél auto » ), pas de termes absolus
  • Les plans sectoriels sont utilisés correctement : beforeAfter uniquement en esthétique ; reviewCard cite textuellement, sans exagération

Liste de vérification avant publication (à remettre à l'utilisateur, pas seulement pour vous-même)

  1. Tous les éléments « Nécessite vérification humaine » sont listés : la liste human de l'étape 9, recopiée textuellement, sans décider pour l'utilisateur « ça devrait aller ». Exemples courants : la citation de reviewCard/credCard est-elle textuellement identique au brief ? les règles de la plateforme ont-elles été mises à jour ? les qualifications sectorielles sont-elles complètes ?
  2. meta.industry est-il correct ? (sinon, les plans autorisés et les règles de conformité seront erronés).
  3. Si des personnes réelles apparaissent, des avis clients ou des photos before/after sont utilisés, un consentement écrit a-t-il été obtenu ? (les champs consent/retouched ne sont qu'une exigence de validation ; l'obtention réelle du consentement est la responsabilité de l'utilisateur, pas de la validation).
  4. La plateforme de diffusion (Douyin, WeChat Video, Xiaohongshu, étranger) correspond-elle à meta.platform ? Les règles spécifiques à cette plateforme (ex : pas de prix affiché avec le panier d'achat) ont-elles été confirmées ?
  5. Projets bilingues : les sous-titres en anglais ont-ils été relus par un locuteur natif ? La machine ne vérifie que le nombre de caractères et les mots sensibles, elle ne détecte pas les formulations maladroites.

Règles strictes (la validation bloque)

  • Le 1er plan doit être hook ; endCard en dernier
  • Durée totale : 15–45 secondes (ou plage meta.durationRange). Chaque type de plan a sa propre plage (voir shots.md)
  • Chaque champ a une limite de caractères ; si dépassée, reformuler entièrement avec une phrase plus courte ; ne pas supprimer des caractères dans un mot pour faire court, ni passer à l'anglais (en anglais, il y a sa propre limite de caractères latins, voir la description du champ correspondant)
  • Utiliser uniquement les champs, valeurs autorisées et noms d'icônes listés dans shots.md ; une faute d'orthographe ou un champ supplémentaire sera signalé comme erreur
  • Au moins un plan démontre meta.action (voir étape 5). Un sous-titre reste à l'écran max 5 secondes
  • brand de la fin = meta.product ; cta de la fin = meta.cta (si le brief n'en donne pas, ne pas en écrire)
  • Pas de backslash dans le texte à l'écran (\n dans le JSON serait affiché tel quel)
  • Interdit à l'écran : URL, QR code, « scannez le code », @compte, « XX compte : nom », « Suivez / cherchez XX compte ». Les mots désignant la catégorie du produit lui-même (ex : un outil de mise en page pour les « articles de compte public ») ne comptent pas comme de la redirection ; ajouter le mot dans meta.allowWords, ne pas modifier le nom du produit pour passer la validation.
  • Mots interdits par la loi sur la publicité : le plus, premier, seul, premier choix, exclusif, haut de gamme, absolu, 100%, tout le réseau, loin devant… (sauf « plus récent/dernier/première étape »). Si une base réelle existe, l'écrire dans meta.allowWords
  • Tout chiffre avec une unité (durée, pourcentage, multiple, nombre de personnes, montant) doit être trouvé dans meta.facts ; sans source, c'est une invention, erreur bloquante
  • Règles sectorielles en trois niveaux : block (toujours bloqué, ex : allégations médicales, prix barré sans justification, avis réel sans mention de mois) ; warn (avertissement mais pas bloquant) ; human (validation impossible, à lister pour l'utilisateur – voir « Liste de vérification avant publication » point 1)
  • Les chemins des fichiers doivent être relatifs au répertoire de storyboard.json et les fichiers exister ; les captures sont en png/jpg/webp, les enregistrements en mp4

Interdictions

  • Ne pas modifier les fichiers dans template/, scripts/, industries/ ; ne pas écrire de coordonnées, pixels, numéros de trames, valeurs de couleur, CSS
  • Ne pas inventer de données ou de sources non fournies par l'utilisateur ; tous les chiffres à l'écran doivent être dans meta.facts ; sans source, écrire « données d'exemple, se référer à la réalité »
  • Ne pas utiliser de noms, logos ou couleurs distinctives d'applications tierces (ex : bulle verte d'une application de chat). Utiliser « l'autre », « le collègue », « le client »
  • Ne pas écrire de vrais noms de personnes, numéros de téléphone, comptes
  • Ne pas utiliser le champ bgm (make.mjs le remplit automatiquement)
  • Ne pas décider vous-même des zones grises de conformité sectorielle (ex : « est-ce que cette phrase est un terme médical ») : si la validation bloque, corriger ; si elle passe mais vous n'êtes pas sûr, l'écrire dans « Nécessite vérification humaine » et le donner à l'utilisateur, ne pas conclure vous-même que « ça devrait aller »

Erreurs courantes et corrections

ErreurCorrection
Ligne N … caractères, chaque ligne max 12 caractèresRaccourcir, ou couper avec \n à une pause sémantique
Utilisation de 2 {} pour l'accentNe garder que le plus important
{} non appariésChaque { doit avoir un } correspondant, pas sur une autre ligne
Mot interdit par la loi : « le plus »Remplacer par une formulation vérifiable : « le plus rapide » → « résultat en 3 secondes »
Le 1er plan doit être hookAjouter hook au début
Le plan endCard ne peut pas avoir de sous-titreSupprimer caption, écrire le slogan dans params.slogan
Champ inconnuVoir « champs disponibles » dans l'erreur, corriger l'orthographe (ex : kind pour mockApp, pas variant)
Icône « xx » inexistanteChoisir parmi la liste des icônes en haut de shots.md
Durée totale … doit être entre 15 et 45 secondesAjouter/supprimer un plan, ou modifier dur
Fichier de source introuvableVérifier le chemin, relatif au répertoire de storyboard.json
Échec d'analyse JSON : ligne NVoir cette ligne : virgule manquante, virgule en trop, guillemets droits anglais dans le sous-titre (remplacer par « »)
Cette phrase doit rester à l'écran N secondesÉcrire caption comme tableau de 2–3 phrases, ou diviser le plan en deux
Aucun plan ne démontre l'action cléAjouter chat (question → réponse dans le panel) ou mockApp (input + résultat)
Le nom du produit à la fin ne correspond pas à meta.productModifier brand pour qu'il soit strictement identique à meta.product
cta écrit mais meta.cta est videSi le brief a un moyen d'obtention, l'écrire dans meta.cta puis le copier ; sinon, supprimer cta
\n textuel dans le JSONLe saut de ligne s'écrit avec un seul backslash
Nom de plateforme « compte public » (avertissement)Mot de catégorie du produit : ajouter à meta.allowWords ; redirection : supprimer
Champ obligatoire meta.action manquantÉcrire une phrase « l'utilisateur fait X → le produit donne Y »
Chiffre introuvable dans meta.factsSi le brief donne ce chiffre, le copier textuellement dans meta.facts (format {"id":"f1","text":"…"}) ; sinon, remplacer le chiffre par une formulation qualitative
Sous-titre contient une description de plan (ex : « les cartes apparaissent une par une »)C'est un sous-titre pour le public, pas une instruction de montage ; le reformuler du point de vue de l'utilisateur
« connection » est une faute d'orthographe, doit être « connexion »Corriger
« parfaitement clair » est une promesse absolueRemplacer par une formulation mesurée, ex : « les infos clés sont visibles »
Le plan « YY » n'est pas ouvert pour le secteur « XX »Choisir un plan autorisé pour ce secteur, ou vérifier si meta.industry est mal choisi
[B-xxx] Conflit avec les règles de conformité sectoriellesSuivre le « comment corriger » dans le message d'erreur ; utiliser meta.allowWords uniquement pour les mots interdits ayant une base réelle (valable seulement pour les warn, les block doivent être supprimés)

En l'absence de vraie capture d'écran

Utilisez d'abord le plan mockApp (il peut être animé). Si vous devez absolument montrer « appuyez ici sur le téléphone », commencez par générer une capture d'écran de mockApp à donner à phone :

cd <SKILL>/template
npx remotion still src/index.ts Screen <chemin_absolu_répertoire_storyboard>/screen.png --frame=145 --props=<chemin_absolu_répertoire_storyboard>/screen-props.json

sreen-props.json doit être {"type":"mockApp","theme":"<thème>","dur":5,"params":{...params du mockApp...}}, cf. <SKILL>/examples/_src/screen-props.json. Ensuite, le plan phone utilise "src": "screen.png" et meta.disclaimer doit contenir « Image d'illustration, contenu simulé ».

Autres exemples (structures variées, choisir selon « type de produit », ne pas copier les sous-titres)

  • <SKILL>/examples/jev.json : B2C émotionnel, secteur software (démonstration chat avec 2 répliques → jauge → quickList → fin ; moyen d'obtention « télécharger la version Android sur le site officiel »)
  • <SKILL>/examples/ledger.json : outil de productivité, secteur software (quickList douleur → comparaison → mockApp (photo de ticket → résultat) → chiffre → fin ; brief sans moyen d'obtention, pas de cta à la fin)
  • <SKILL>/examples/meeting.json : B2B bureau, secteur software (capture d'écran annotée → interface simulée → chiffre → étapes → fin ; moyen d'obtention « demande d'essai gratuit sur le site officiel »)
  • <SKILL>/examples/en-focus.json : exemple en anglais (meta.lang: "en"), app fictive, montre comment rédiger les sous-titres en anglais)
  • Les exemples de conformité pour les autres secteurs (food/ecommerce/education/beauty/travel) se trouvent dans industries/<industry>/test-brief.md + expected.md : test-brief est un exemple de brief, expected explique quels plans et sous-titres seraient bloqués et pourquoi. Pour commencer un nouveau secteur, il est conseillé de lire ces deux fichiers.

Exemple complet (examples/ledger.json, passe la validation)

{
  "meta": {
    "title": "Vidéo promotionnelle Comptabilité simplifiée (douleur → produit → 3 arguments → fin)",
    "product": "Comptabilité simplifiée",
    "theme": "fresh-light",
    "disclaimer": "Images d'illustration, données d'exemple",
    "action": "Prendre une photo du ticket → montant et catégorie remplis automatiquement",
    "facts": [
      {"id": "f1", "text": "Les utilisateurs de l'essai ont économisé en moyenne environ 1260 yuans de plus ce mois-ci par rapport au mois dernier (données d'exemple)"},
      {"id": "f2", "text": "Exemples d'entrées du carnet de démonstration : livraison ¥860, bubble tea/café ¥326, abonnement automatique oublié ¥98, course de nuit ¥410 (données d'exemple)"},
      {"id": "f3", "text": "Saisie manuelle : environ 5 minutes ; avec le produit : environ 10 secondes (données d'exemple)"},
      {"id": "f4", "text": "Résultat de la reconnaissance : déjeuner ¥38,5, budget repas du mois utilisé à 62% (données d'exemple)"}
    ]
  },
  "shots": [
    {
      "type": "hook",
      "dur": 2.5,
      "caption": "Le salaire à peine reçu,\nà la fin du mois {plus rien}",
      "mood": 0.85,
      "params": {"visual": "stat", "text": "¥ 0.00", "sub": "Où est passé cet argent ?", "badge": "Prends une photo du ticket pour le noter", "tone": "bad"}
    },
    {
      "type": "quickList",
      "dur": 3.5,
      "caption": "Où est passé l'argent,\n{aucun souvenir}",
      "mood": 0.8,
      "params": {
        "title": "Destination inconnue ce mois-ci",
        "items": [
          {"text": "Livraison", "tag": "¥860", "tone": "bad", "icon": "bell"},
          {"text": "Bubble tea/café", "tag": "¥326", "tone": "warn", "icon": "heart"},
          {"text": "Abonnement auto oublié", "tag": "¥98", "tone": "bad", "icon": "calendar"},
          {"text": "Course de nuit", "tag": "¥410", "tone": "warn", "icon": "clock"}
        ]
      }
    },
    {
      "type": "compare",
      "dur": 4.5,
      "caption": "Pour la comptabilité,\n{arrête de compter sur ta volonté}",
      "mood": 0.45,
      "params": {
        "mode": "lr",
        "left": {"title": "Saisie manuelle", "items": ["Chaque dépense saisie à la main", "Catégorisation au hasard", "On abandonne en cours de route"], "tone": "bad", "icon": "doc", "stat": "5 minutes", "level": 8},
        "right": {"title": "Comptabilité simplifiée", "items": ["Reconnaissance auto par photo", "Catégorisation automatique", "Bilan en un clic en fin de mois"], "tone": "good", "icon": "bolt", "stat": "10 secondes", "level": 2},
        "meterLabel": "Niveau de difficulté",
        "verdict": "Noter une dépense en dix secondes"
      }
    },
    {
      "type": "mockApp",
      "dur": 4.5,
      "caption": "Prends une photo du ticket,\n{montant et catégorie remplis}",
      "mood": 0.25,
      "params": {
        "kind": "editor",
        "title": "Noter une dépense",
        "source": "Données d'illustration, pas un relevé réel",
        "input": "Photo : ticket de déjeuner",
        "button": "Reconnaître",
        "items": [
          {"text": "Déjeuner ¥38,5"},
          {"text": "Commerçant : Restaurant du rez-de-chaussée"},
          {"text": "Catégorie : Repas (auto)"},
          {"text": "Repas du mois : 62% utilisé"}
        ],
        "highlight": 3,
        "done": "Noté"
      },
      "note": "Démonstration de l'action clé : l'utilisateur prend une photo du ticket → le produit donne le montant, le commerçant, la catégorie"
    },
    {
      "type": "counter",
      "dur": 3,
      "caption": "En fin de mois,{il reste encore}",
      "mood": 0.1,
      "params": {"to": 1260, "prefix": "¥", "label": "Économisé en plus ce mois-ci par rapport au mois dernier", "sub": "Données d'exemple, résultats variables", "icon": "money", "tone": "good"}
    },
    {
      "type": "endCard",
      "dur": 4,
      "mood": 0,
      "params": {
        "brand": "Comptabilité simplifiée",
        "slogan": "Chaque dépense,\n{un œil dessus}",
        "points": ["Photo du ticket → comptabilité automatique", "Carnet uniquement sur ton téléphone"],
        "icon": "money"
      }
    }
  ]
}

Skills associés