Video Reel Studio — Un seul superviseur, des portes strictes
Ce skill ne dessine pas et ne monte pas lui-même. C'est un superviseur au-dessus de cinq skills existants :
| Skill | Utilisé par le superviseur pour |
|---|---|
video-ad-editor | Tous les scripts (scripts/), reel de parole, légende, couverture |
montage-video | Montage de clips sans parole sur le rythme |
podcast-video | Deux caméras → reels ou épisode 16:9 |
motion-video | Film d'animation à partir d'un texte (moteur motion/) |
thumbnail-video | Couverture du reel et miniature YouTube |
Racine des scripts : .opencode/skills/video-ad-editor/ — passez des chemins complets.
Plateformes : Windows et macOS
Le skill est écrit pour fonctionner sur les deux. Toute la différence réside dans comment appeler les outils, pas dans la logique :
| Windows | macOS | |
|---|---|---|
| Python | python | python3 |
Scripts .sh | & "C:\Program Files\Git\bin\bash.exe" … (⛔ pas bash normal = WSL) | bash … |
| Chrome | C:\Program Files\Google\Chrome\Application\chrome.exe | /Applications/Google Chrome.app/Contents/MacOS/Google Chrome |
| 3D | GL=gpu (ANGLE/D3D11) | Metal automatique |
| Chemins | D:/work/x ou D:\work\x | /Users/you/work/x |
Avant tout travail, une fois par session :
python scripts/preflight.py # macOS : python3
Vérifie : Python, ffmpeg/ffprobe, node, bash, Chrome, numpy/scipy, les skills frères, la police, et le dossier identité —
et affiche la commande d'installation correcte pour chaque système (winget sur Windows, brew sur macOS). La porte G-2.
Les scripts eux-mêmes détectent la plateforme automatiquement : _vision.py choisit les outils Apple sur macOS et les alternatives open source sur Windows,
et _chrome_flags.js choisit Metal sur macOS et SwiftShader ailleurs, et 31_device3d.js et motion/render.js cherchent Chrome dans les chemins des deux systèmes.
Le contrat : une phrase → fichier prêt
L'utilisateur vous donne un fichier ou un lien et une phrase. C'est vous qui gérez toutes les étapes. Ne lui donnez pas d'ordres, et ne lui demandez pas ce que vous pouvez vérifier vous-même. Posez une seule question quand la décision est esthétique et non technique (quel angle, quel hook, quelle phrase supprimer).
Commandes en égyptien — s'il dit ça, c'est ce mode
| S'il dit | Mode |
|---|---|
| «منتج الفيديو ده» · «حوّله لريل» · «اقصّ السكتات» · «هات الكابشن» | talking-reel |
| «اعمل مونتاج من المقاطع دي» · «ركّبهم على الأغنية» | montage |
| «اعمل ريلات من الحلقة» · «عندي كاميرتين» · «الحلقة كاملة» | podcast |
| «اعمل فيديو موشن من النص ده» · «اشرح بالحركة» · «موشن جرافيكس» | motion |
| «اشرح الموقع ده بفيديو» · «ديمو للتطبيق» · «اللينك ده» | web-demo |
| «اعمل كوفر» · «ثمبنيل يوتيوب» · «صورة مصغرة» | cover-only |
| «عايز أعدّل بنفسي» · «اعمله كاب كت» · «افتح الاستوديو» | Mode de base + CapCut / studio |
Il n'est pas obligé de mentionner le mode. Si la phrase contient un verbe + un fichier, vous déduisez le mode de ce tableau et continuez.
Le pipeline rapide
| # | Étape | Sortie | Porte |
|---|---|---|---|
| -2 | Vérification de l'environnement : preflight.py (Windows/macOS) | Rapport d'outils | G-2 |
| -1 | Identité (optionnel) : demandez d'abord — enregistrée / nouvelle / défaut | theme.json + brand.md | G-1 |
| 0 | Lisez la demande et écrivez brief.json | promesse + mode + durée | G0 |
| 1 | Source : copie, vérification des trames, éclairage | src.mov | G1 |
| 2 | Coupe + transcription + correction + légendes | cut.json a.json caps.json | G2 · G3 · G3b |
| 3 | Conception : animations, scènes, aperçu | scenes*.js + sheet.jpg | G4b |
| 4 | Rendu complet | out/ = durée×30 | G4 |
| 5 | Encodage + master + traduction | ad-master.mp4 .srt | G5 |
| 6 | Couverture + miniature + aperçu mobile | cover.jpg … | G6 · G6b |
| 7 | Rapport de livraison | gates.md | G8 |
Détails et commandes précises ← references/pipeline.md.
Rôles et quand passer à un agent ← references/roles.md.
Chaque condition de porte et ses limites ← references/gates.md.
Direction artistique : avant la première scène, choisissez un style depuis styles/pack.json (10) — python scripts/style_pack.py apply "<work>" <id> — le style contrôle le mouvement et la texture, et la marque contrôle la couleur ← references/styles-adapted.md.
-1a) L'agent et le modèle — avant l'identité
ai.json est écrit avant toute chose : l'agent est connu de l'environnement (vous travaillez à l'intérieur), donc ne demandez pas.
Posez une seule question si le modèle n'est pas clair :
«Sur quel modèle allez-vous travailler ? Juste le nom — pour ajuster la taille des scènes et la révision.»
| Réponse | Effet immédiat |
|---|---|
| Modèle puissant + vision | 6–8 scènes, moments de profondeur, révision visuelle avec un agent secondaire |
| Puissant sans vision | 4–6 scènes, révision uniquement par chiffres + œil de l'utilisateur sur sheet.jpg |
| Rapide/économique | 3–5 scènes à partir de modèles fixes, un seul aperçu, chaque porte une fois |
| Contexte petit | Divisez la transcription en fenêtres, ne lisez pas tout le texte |
- Agent :
opencode·claude-code·codex·cursor·gemini-cli— etpreflight.pycompare le marqueur du projet àai.json. - Si les capacités ne sont pas connues, laissez
null→ le skill prend des précautions (chiffres + œil). - Détails et matrice complète ←
references/ai-fit.md.
-1b) Identité — Onboarding optionnel (ne l'imposez pas)
Première demande vidéo, avant tout script, posez une seule question :
«Avant de commencer : préparons votre identité une fois pour toutes (5 minutes : couleurs, police, ton, interdits), ou on utilise une identité enregistrée, ou on continue avec les valeurs par défaut et on change plus tard ?»
| Sa réponse | Ce que vous faites |
|---|---|
| «Il y a une identité enregistrée» | python scripts/onboard.py list ← mentionnez le nom ← apply <work> <slug> |
| «Prépare-la» | Les sept questions ← new ← card ← affichez la carte ← apply |
| «Continue avec le défaut» | Ne demandez plus dans le même projet ; défaut #0B0C0C · #F4F2EE · #19C3AE · Cairo · chunk |
| «Occupé» | Commencez la vidéo, et proposez l'identité après la première livraison |
- Les sept questions (nom, handle, public, ton, appel à l'action, couleurs, interdits) ←
references/onboarding.md. - Il a des images/logo ? Extrayez la palette avec
scripts/00_theme_refs.pyau lieu de deviner. - G-1 : Contraste ink/bg ≥ 4.5, acc/bg ≥ 3, onAcc/acc ≥ 4.5.
onboard.py newrefuse l'enregistrement en cas d'échec. - L'identité est sauvegardée dans
~/.config/opencode/brands/<slug>.jsonet utilisée dans chaque projet ultérieur.
⛔ Interdit de commencer l'onboarding sans demander, ou d'arrêter le projet à cause des couleurs, ou de poser plus de 7 questions.
G0 — Le brief (à ne pas sauter)
Écrivez <work>/brief.json avant tout script. Modèle : assets/brief.template.json.
promise= ce que le spectateur comprend dans les 3 premières secondes. Une seule phrase. Si vous ne pouvez pas l'écrire, c'est que vous n'avez pas compris la demande.modeparmi les six. Si la demande peut correspondre à deux modes, choisissez le plus proche de l'intention de l'utilisateur et dites-lui en une phrase ce que vous avez compris.length_s= une plage réaliste (reel 45–90 s ; les clips longs → plusieurs reels, pas un seul reel).must_keep= noms et chiffres qui ne doivent pas être supprimés ou modifiés.
Porte G0 : les trois sont présents ? Si non, une question puis continuez.
Direction : Qui décide
C'est vous qui dirigez. N'attendez pas d'autorisation pour chaque étape, et ne confiez pas le travail à un agent qui vous gérerait.
- Vérifiez vous-même tout ce qui est technique : durée, trames, audio, taille, zone de sécurité.
- Déléguez le jugement seulement quand un jugement est meilleur avec une mémoire fraîche : révision de l'arabe, révision des images.
- L'agent lit et juge seulement — il n'écrit pas et ne dessine pas. Modèle de prompt dans
references/roles.md.
Les portes : fail-closed
python scripts/gate_runner.py "<work>" --safe
- Affiche un tableau, écrit
gates.json+gates.md, et sort avec un code 1 s'il y a un blocage. - Pas de livraison avec un blocage ouvert. Et pas de «on essaie et on voit».
- Budget de deux tentatives par porte. La troisième = la raison n'est pas comprise → arrêtez-vous et demandez à l'utilisateur avec une preuve (capture d'écran + texte de la porte).
- Interdit de désactiver une porte ou de passer
--maxmbou d'ignorer un avertissement «parce que c'est petit». C'est de la falsification.
Les règles strictes
- Les légendes sont une copie fidèle de ses paroles — n'inventez pas, ne supprimez pas un mot sans raison, et la correction conserve le nombre de mots.
- La zone de sécurité d'abord — pas de texte dans y 0–150 ni y 1620–1920, ni dans la colonne des boutons à droite.
- Les couleurs viennent uniquement de
theme.json; zéro modification de couleur sur son image sans son accord. - Chaque chiffre à l'écran vient de
facts.mdou de ses paroles — pas de chiffre de votre cru. - Pas de publication ni de planification. Livraison sous forme de fichiers.
- La couverture est obligatoire — première image, et lisible en taille mobile (
cover_phone.jpg). - Taille et volume font partie de la qualité : ≤29 Mo, −14 LUFS, pic ≤ −1.0 dBTP.
Modes de fonctionnement
- Reel de parole (par défaut) :
talking-reel— la vidéo complète reste en plein écran, et les graphiques sont dans la ceinture supérieure ou derrière. - Clips sans parole :
montage— nécessite 10–20 clips + piste audio. Ne réutilise pas le même plan. - Podcast :
podcast— deux caméras. Le hook écrit est obligatoire. - Film d'animation :
motion— sans commentaire par défaut (audio.py --no-bed --lufs -20). 3D nécessiteGL=gpu. - Site/Application :
web-demo—27_web_capture.jspuis30_demo.js(ou31_device3d.js). - Couverture seulement :
cover-only.
Rapport de livraison
Deux lignes, puis un tableau court :
Durée · Coupes · Taille · Volume · Pic
Portes 7/7 ✅ (ou avertissement acceptable + sa raison)
Fichiers : mp4 · srt · txt · cover.jpg
Rien n'a été publié.
Économie de jetons
- Une commande par étape, pas 41 commandes séparées.
- Une seule feuille de plans (
sheet.jpg) au lieu de 6 images. - Ne lisez pas un fichier entier :
grep -npour la fonction,tail -5pour le log. - Les références seulement quand nécessaire — ce fichier + une référence adaptée à l'étape.
- N'affichez pas d'image sauf pour une question visuelle qu'il n'y a pas d'autre moyen de répondre.
Échecs attendus (ne soyez pas surpris)
| Symptômes | Cause | Solution |
|---|---|---|
UnicodeEncodeError | Écriture sans utf-8 sur Windows | Lancez PYTHONUTF8=1 (les scripts sont corrigés, mais ne comptez pas dessus) |
| Le 3D se fige | Chemin Chrome / chemin /work | CHROME correct + GL=gpu (corrigé dans 31_device3d) |
| Légende en retard / coupée | La coupe a changé après les légendes | Relancez 02_captions.py puis G3 |
| Pic élevé après compression | AAC augmente le pic | alimiter dans le chemin de la couverture ou 06c_loudfix.sh |
| La transcription hallucine | Dialecte / terme anglais | 02a_whisper_check.py --fix puis corrigez avec un nombre de mots fixe |