15yotsuka/claude-skills

Compétence d'agent de création de vidéos de démonstration SaaS (MP4) à partir de captures d'écran de sites Web ou d'applications locales.

Qu'est-ce que claude-skills ?

Cette compétence, nommée `saas-demo-maker`, permet à un agent IA (comme Claude Code ou un agent similaire) de créer des vidéos de démonstration SaaS (MP4) de haute qualité, sans son, à partir de captures d'écran de n'importe quelle application Web ou locale. Elle est basée sur le pipeline Castify éprouvé et le généralise pour tout projet Aperone. L'agent capture automatiquement les écrans via Playwright (Chromium headless) avec une résolution de 1280×720, puis génère une vidéo professionnelle avec des animations contrôlées (aucun effet Ken Burns, uniquement des fondus et des transitions de diapositives horizontales). La vidéo inclut une barre de progression, un panneau de légende, un badge produit, et un dégradé pour masquer les artefacts de développement, le tout en respectant des règles de conception strictes. Le processus est entièrement automatisé : l'agent écrit les scripts Python (`capture_screenshots.py` et `generate_saas_demo.py`), les exécute, effectue une vérification de qualité avec `ffprobe`, et se répare automatiquement en cas d'échec (jusqu'à 3 tentatives). Il prend en charge trois modes : complet (capture + rendu), capture uniquement, et rendu à partir de captures existantes.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add 15yotsuka/claude-skills

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

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

Documentation

saas-demo-maker

Présentation

Cette compétence capture des captures d'écran de n'importe quelle application Web ou locale et génère une vidéo de démonstration SaaS soignée et silencieuse (MP4). Elle est calquée sur le pipeline Castify éprouvé dans ~/SaaS/castify/generate_castify_demo.py et le généralise pour tout projet Aperone.

Lorsqu'elle est invoquée, vous DEVEZ produire un MP4 d'ici la fin de la session. Ne vous arrêtez pas à « voici un plan » — exécutez-le.


Quand l'utiliser

Déclenchez-la si l'un des éléments suivants correspond (correspondance partielle ou reformulation incluse).

Déclencheurs en japonais

  • デモ動画 / デモMP4 / デモ動画を作って / デモ動画を生成して
  • プロモ動画 / 紹介動画 / サービス紹介動画
  • スクショ撮って動画にして / スクリーンショットを動画にして
  • 動画を作って(contexte SaaS ou application)
  • 既存のスクショから動画を作って
  • 画面録画(informer que la capture d'écran sera utilisée comme alternative, puis exécuter)

Déclencheurs en anglais

  • demo video / demo MP4 / product demo
  • promotional video / promo video / intro video
  • screenshot to video / capture and render
  • make a video from screenshots

Commande directe /saas-demo-maker

Cas ambigus (peuvent être déclenchés)

  • Contient « vidéo », « MP4 » ou « capture d'écran » dans le contexte d'une application, d'un SaaS ou d'un outil.
  • Fait référence à une application locale ou à une URL publique.
  • Demande de créer une vidéo à partir d'images existantes.

Entrées

Analyser à partir du message de l'utilisateur :

EntréeValeur par défautRemarques
url—URL complète ou http://localhost:3000
product_namedéduit du projetUtilisé dans le badge et la configuration
brand_color#7c3aedRemplace la constante VIOLET
screens5Nombre de captures d'écran
output_pathoutput/saas_demo.mp4Relatif à la racine du projet
modefullfull / capture / render
localeja si message en japonais, sinon enAffecte le texte des étapes
stepspréréglage de templates.mdLe texte fourni par l'utilisateur prévaut
assets_diroutput/screenshotsImages source pour le mode rendu

Modes

Mode complet (full)

Capture des captures d'écran à partir d'une URL en direct ou d'une application locale, puis rendu de la vidéo.

Exemples de déclenchement :

/saas-demo-maker Crée une vidéo de démo pour une fiche service à partir de https://castify.aperone.com. 5 écrans, moins de 20 secondes, couleur de marque #7c3aed, sortie output/castify_demo.mp4
/saas-demo-maker Capture les écrans de http://localhost:3000 : page d'accueil, connexion, tableau de bord, saisie, résultat, puis crée un MP4 de démo SaaS pour boucle sans son.

Mode capture (capture)

Capture d'écran uniquement — pas de rendu vidéo.

Exemples de déclenchement :

/saas-demo-maker Prends seulement les captures d'écran. Page d'accueil, connexion, tableau de bord, saisie, résultat : 5 images.

Mode rendu (render)

Rendu vidéo à partir de captures d'écran existantes — aucune étape de capture.

Exemples de déclenchement :

/saas-demo-maker Crée une vidéo à partir des 5 captures d'écran existantes dans assets. Nom du produit : Aperone Academy, couleur de marque #7c3aed.
/saas-demo-maker Crée une vidéo à partir des 5 captures dans assets. Nom du produit : Castify, sortie output/castify_demo.mp4.

Workflow

Étape 0 — Pré-vol

  1. Lire demo_config.json s'il existe dans le projet actuel.
  2. Vérifier les captures d'écran existantes dans output/screenshots/ ou assets/.
  3. Détecter le mode à partir du message de l'utilisateur (par défaut : full).
  4. Vérifier que le répertoire output/ existe ou le créer.

Étape 1 — Générer la configuration

Écrire demo_config.json à la racine du projet :

  • Utiliser les valeurs analysées du message utilisateur.
  • Choisir le texte des étapes à partir du préréglage templates.md correspondant à product_name, ou un modèle générique pour le nombre d'écrans, ou le texte fourni par l'utilisateur.
  • Écrire le fichier maintenant, avant toute génération de script.

Étape 2 — Écrire les scripts (mode complet ou capture)

Écrire capture_screenshots.py à la racine du projet. Écrire generate_saas_demo.py à la racine du projet. Écrire README_demo_video.md à la racine du projet (uniquement la première fois ; ignorer si existe).

Pour le mode rendu, ignorer capture_screenshots.py.

Étape 3 — Installer les dépendances (si manquantes)

Vérifier et installer si nécessaire (voir reference.md pour les commandes) :

  • ffmpeg — which ffmpeg || brew install ffmpeg
  • pillow — python3 -c "import PIL" || python3 -m pip install pillow
  • Pour la capture TypeScript : vérifier que node_modules/playwright existe

Étape 4 — Capturer (mode complet ou capture)

Exécuter le script de capture :

python3 capture_screenshots.py

Ou si le projet possède déjà un script de capture TypeScript Playwright (par exemple, scripts/demo-screenshots.ts), le privilégier :

npx tsx scripts/demo-screenshots.ts

Vérifier que output/screenshots/ contient au moins 2 fichiers PNG après la capture. Si la capture échoue, lire l'erreur, corriger capture_screenshots.py, et réessayer.

Étape 5 — Rendre (mode complet ou rendu)

Exécuter :

python3 generate_saas_demo.py

Surveiller les erreurs. Si le script plante, lire la trace, corriger le script et réexécuter. Ne pas demander à l'utilisateur — se réparer automatiquement jusqu'à 3 tentatives.

Étape 6 — Vérification qualité

Exécuter ffprobe pour vérifier :

ffprobe -v error -select_streams v:0 \
  -show_entries stream=width,height,duration,codec_name,pix_fmt \
  -of default output/saas_demo.mp4

Vérifier les 10 éléments de la liste de contrôle qualité dans reference.md. Si un élément échoue, corriger et refaire le rendu.

Étape 7 — Rapport

Produire la réponse finale (voir « Format de la réponse finale » ci-dessous).


Spécifications de capture d'écran

Résolution

1280 × 720 (fenêtre Chromium)

Navigateur

Playwright Chromium, sans tête.

Stratégie d'attente

await page.goto(url, wait_until="networkidle")
await page.wait_for_timeout(800)  # temps de stabilisation supplémentaire

URL locales candidates (essayer dans l'ordre)

http://localhost:3000
http://localhost:5173
http://localhost:8000
http://localhost:8080

Répertoire de sortie

output/screenshots/ relatif à la racine du projet.

Noms de fichiers standard

01-landing.png
02-login.png
03-dashboard.png
04-input.png
05-result.png
06-options.png   (si 6 écrans ou plus)
07-processing.png (si 7 écrans)

Démarrage de l'application locale

  1. Lire package.json pour trouver le script de développement (dev, start, etc.).
  2. Démarrer le serveur de développement en arrière-plan.
  3. Attendre que l'URL candidate réponde (max 30 s).
  4. Capturer les écrans.
  5. Arrêter le serveur de développement.

Gestion de l'authentification

  • Si .env contient des identifiants de test et un indicateur de contournement de développement (par exemple, DEV_BYPASS_AUTH=true), le définir dans l'environnement avant le lancement.
  • Pour les écrans de connexion : remplir un email de démo (demo@<product>.io) sans soumettre — capturer l'état rempli comme écran de connexion.
  • Ne pas tenter de contournement réel de l'authentification ou de connexion par force brute.
  • Si une page redirige vers la connexion et que le contournement n'est pas disponible, utiliser l'écran de connexion comme l'un des écrans de démo (cela semble crédible).

Artefacts en mode développement

Bannière du mode développement Clerk, indicateur de développement Next.js, superpositions de débogage — NE PAS essayer de les supprimer dans le navigateur. Les masquer à l'étape de rendu avec une superposition dégradée ou un panneau sombre en bas de la carte.


Spécifications de rendu

Architecture

Générer toutes les images sous forme de fichiers PNG dans output/frames/, puis encoder avec ffmpeg. Ne PAS utiliser moviepy pour l'encodage — utiliser directement un sous-processus ffmpeg.

Dimensionnement des images

card = ImageOps.fit(image.convert("RGBA"), (card_w, card_h),
                    method=Image.Resampling.LANCZOS)

C'est la SEULE méthode de dimensionnement d'image autorisée. La capture d'écran doit être complètement statique à l'intérieur de chaque scène — pas de zoom, pas de panoramique, pas d'effet Ken Burns.

Effet Ken Burns — INTERDIT

N'appliquer aucun facteur d'échelle par image ou décalage de position à la capture d'écran. Le contenu des pixels de la capture ne doit pas changer entre l'image 0 et l'image 98 d'une scène. Seules les superpositions (légende, badge, barre de progression, lueur) peuvent être animées.

Animation de la légende (autorisée)

Le panneau de légende peut apparaître en fondu et se déplacer vers le haut de 8 px sur les 20 % premiers d'une scène (scene_t < 0.2). C'est la seule animation autorisée sur le calque d'image.

Timing

SCENE_SECONDS     = 3.3   # fixe — ne pas modifier
TRANSITION_SECS   = 0.4   # fixe — ne pas modifier
FPS               = 30
SCENE_FRAMES      = 99
TRANSITION_FRAMES = 12

Transition

Diapositive horizontale : l'image sortante quitte par la gauche, l'image entrante entre par la droite. Utiliser ease_in_out_cubic. Ajouter un voile d'atténuation étroit à la limite de coupure. Voir reference.md pour l'algorithme complet.

Commande ffmpeg

Utiliser la commande exacte de reference.md. Indicateurs clés : -c:v libx264 -pix_fmt yuv420p -movflags +faststart -an -crf 18


Règles de conception visuelle

Arrière-plan

#020617  (BG)  — remplissage derrière la carte

Disposition de la carte

card_box = (34, 22, LARGEUR-34, HAUTEUR-22)
radius   = 30

Ligne d'accentuation chromée en haut à card_box[1] + 48. Bordure de la carte : 1 px CARD_EDGE.

Superpositions (toutes obligatoires)

  • Barre de progression — segmentée, en haut de la carte, remplissage violet pour les étapes terminées
  • Panneau de légende — en bas à gauche, panneau sombre en verre, ÉTAPE N / nom / corps
  • Badge produit — en bas à droite, point de la couleur de marque + nom du produit
  • Lueur de focus — lueur violette autour de l'élément d'interface clé (voir reference.md pour l'inférence)
  • Vignette — bord arrondi sombre subtil sur l'image complète
  • Dégradé inférieur — masque les artefacts du mode développement dans la zone inférieure de la carte si nécessaire

Éléments de conception interdits

  • Texte blanc sur boîte noire unie (pas d'effet verre)
  • Lueur excessive / saturation excessive
  • Transformations 3D ou déformations de perspective
  • Toute distorsion de l'interface utilisateur de la capture d'écran
  • Modification ou remplacement du texte visible dans la capture d'écran

Règles de configuration

Écrire demo_config.json avant d'exécuter un script. Lors d'une réexécution en mode rendu, lire d'abord la configuration existante et fusionner les remplacements de l'utilisateur plutôt que de l'écraser.

Schéma :

{
  "product_name": "string",
  "brand_color": "#7c3aed",
  "output_path": "output/saas_demo.mp4",
  "screenshots": ["output/screenshots/01-landing.png"],
  "steps": [{ "step": 1, "name": "...", "body": "...", "focus": null }],
  "fps": 30,
  "resolution": [1280, 720],
  "mode": "full",
  "locale": "ja"
}

Exigences de mise en œuvre

Responsabilités de capture_screenshots.py :

  • Lancer Playwright Chromium en mode sans tête
  • Définir la fenêtre à 1280 × 720
  • Naviguer vers chaque URL cible, attendre networkidle + 800 ms de stabilisation
  • Enregistrer les PNG dans output/screenshots/ avec les noms de fichiers standard
  • Déplacer la souris hors écran avant chaque capture (page.mouse.move(1400, 800))
  • Afficher le succès/échec par capture
  • Code de sortie 0 en cas de succès, 1 en cas d'échec

generate_saas_demo.py doit contenir toutes les fonctions listées dans reference.md. Invariants clés :

  • SCENE_SECONDS = 3.3 — codé en dur, aucune modification de configuration
  • TRANSITION_SECONDS = 0.4 — codé en dur, aucune modification de configuration
  • fit_cover() appelle ImageOps.fit() — pas d'arithmétique de zoom
  • render_scene() ne modifie PAS l'échelle par image
  • encode_video() appelle le sous-processus ffmpeg avec l'option -an

Liste de contrôle qualité

Après la réussite de encode_video(), vérifier TOUS les points suivants avant de signaler la fin :

  1. output/saas_demo.mp4 existe, taille > 100 Ko
  2. Durée à ±2 s de (nombre_d_écrans × 3,3 s)
  3. Largeur=1280, Hauteur=720 (confirmé par ffprobe)
  4. Aucun flux audio
  5. codec_name = h264
  6. pix_fmt = yuv420p
  7. Toutes les captures d'écran apparaissent dans le bon ordre
  8. Aucune bannière de développement flagrante visible (masquée par superposition si nécessaire)
  9. L'écran de résultat/sortie communique clairement la valeur du produit
  10. Le texte de la légende est lisible sur toutes les scènes

Exécuter cette vérification :

ffprobe -v error -select_streams v:0 \
  -show_entries stream=width,height,duration,codec_name,pix_fmt \
  -of default output/saas_demo.mp4

Récupération après échec

ÉchecRécupération
ffmpeg introuvablebrew install ffmpeg, puis réessayer
PIL introuvablepython3 -m pip install pillow, puis réessayer

Skills associés