Communitygithub.com

vosjs/vos-cut

Découpez un enregistrement d'écran (un vosso take) en la vidéo produit pour laquelle il a été enregistré, à partir de ses preuves, avec la CLI vos — lisez le digest (les moments que la piste du curseur considère importants, chacun avec une image de la séquence et un recadrage), racontez les temps forts, éditez doc.json par exception par rapport aux planificateurs, vérifiez avec des arrêts sur image, et publiez une version attribuée que l'humain peaufine sur vos.so ; chaque édition est un patch de données, donc un recoupage ne réenregistre jamais. À utiliser lorsque l'on vous demande d'éditer ou couper un enregistrement, de réaliser une vidéo produit ou un clip de nouveautés à partir d'un take, de le couper comme le précédent, ou de couper une série d'enregistrements dans un seul style.

Qu'est-ce que vos-cut ?

Ce skill transforme un enregistrement d'écran (un vosso `take`, composé du fichier vidéo `recording.webm`, du `cursor.json`, du `meta.json` et du `doc.json`) en une vidéo produit soignée sans jamais réenregistrer la séquence originale. Il fonctionne entièrement en local via le CLI `@vosjs/cli` et exploite les métadonnées de la piste du curseur et les données de planification automatisée pour proposer des rythmes, des zooms, des accélérations et des incrustations de texte, que l'humain n'a plus qu'à valider ou ajuster. Le skill est prévu pour être utilisé avec des agents IA (Claude Code, Cursor, etc.) et suit une boucle rigoureuse : voir le digest, narrer les temps forts, décider par exception en modifiant uniquement ce que les planificateurs automatiques ne peuvent pas savoir, vérifier avec des images clés, publier la version, et recouper si l'humain le demande. Il gère aussi l'application d'un style cohérent à une série de vidéos, l'enregistrement de règles de coupe dans des recettes (`CUT.md`, `BRAND.md`), et la protection des modifications humaines contre les écrasements accidentels.

Compatible avec✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/vosjs/skills/tree/main/skills/vos-cut

Demander à votre IA préférée

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

Documentation

Couper un take à partir de ses preuves

Vous coupez un ENREGISTREMENT réalisé par quelqu'un (un vosso take : recording.webm + cursor.json + meta.json + doc.json), vous n'en enregistrez pas un. L'enregistrement à partir d'un script relève du skill product-video ; les programmes sont vos-create/vos-remix.

La boucle est : voir → narrer → décider par exception → vérifier → publier → (l'humain regarde) → recouper. Chaque étape nomme le verbe qui l'exécute. Le document est doc.json ; le contrat pour ses champs et unités est https://vos.so/llms-full.txt. Rien ici ne réenregistre jamais un take humain : un coupage ne peut pas réparer la séquence, et si la séquence ne peut pas porter la demande, vous le dites dans la note et vous arrêtez.

Configuration

npm i -D @vosjs/cli   # fetch, digest, plan, frames, render, push, pull

Identifiants, dans cet ordre, jamais affichés : VOS_API_KEY, puis la première ligne de ~/.config/vos/credentials, puis vos login (une connexion via navigateur qui génère une clé pour cette machine). Les clés créent un travail PRIVÉ uniquement et ne peuvent jamais publier. Un Chromium est nécessaire pour digest, frames et render.

0. Règles de base qui remplacent tout ce qui suit

  • Ne lisez jamais la vidéo. Vos yeux sont vos digest : digest.json, puis sheet.png, puis un recadrage uniquement là où vous devez décider. Un take de 90s compte ~35 moments et ~25-40k tokens image si vous lisez chaque image ; la feuille plus les recadrages décisifs représente ~10k. L'événement done imprime l'estimation.
  • Éditez par exception. Les planificateurs (zoom, vitesse, inclinaison) ont déjà répondu OÙ se trouve chaque clic, session de saisie, défilement et temps mort. plan dans le digest contient leurs étendues et proposed nomme celles qui se trouvent sous chaque moment. Conservez, fusionnez, supprimez ou retemporalisez ces étendues ; ajoutez seulement ce qu'un planificateur ne peut pas savoir (quel clic isolé mérite un temps fort, une légende, une accélération ennuyeuse mais non inactive). Chaque étendue que vous touchez porte "source": "manual". Une proposition que vous SUPPRIMEZ va dans rejected ([{id, lane, in, out}], la piste et son étendue source) afin qu'aucun nouveau plan, et qu'aucun réenregistrement issu de plan --reuse, ne propose ce temps fort à nouveau ; le studio l'écrit lui-même lorsqu'un humain supprime une étendue automatique.
  • Pointez avec un calque, pas la caméra. Lorsque le coupage pointe vers un composant (un bouton, une carte, un bloc de code) et que le zoom agrandirait les pixels, redessinez-le sous forme de calque html dans doc.json (overlays[] avec kind: "html" : le balisage, le CSS dans le propre type du produit, la boîte de design en px 1080p) placé à côté de son sujet, jamais dessus. Vous avez les vrais composants du produit dans le dépôt ; utilisez-les. Le balisage est du XML bien formé et vos validate indique ce qui ne s'afficherait pas ; une animation CSS s'exécute sur l'horloge murale et est refusée au profit de anim et motion.
  • Les unités du doc, copiées, jamais converties. Le focus d'un moment est le cx/cy d'une étendue de zoom ; son rect est ce que le zoom doit contenir. Les étendues source sont en secondes de séquence (zoom/vitesse/inclinaison/segments) ; les étendues output sont en secondes rendues (overlays/audio). Les valeurs de pixels où que ce soient sont l'erreur n°1.
  • Les modifications humaines sont sacrées. doc.manual dans le digest compte les étendues qu'un humain a décidées ; un push qui touche un nœud que l'humain a modifié depuis votre base renvoie 409s protected_conflict. Conservez leurs valeurs sauf si la demande nomme exactement ce nœud.
  • Trois rounds seul, puis un humain. Round = éditer → valider → images → juger. Si cela ne fonctionne pas en trois, poussez le meilleur round et dites pourquoi.
  • La demande décide ; les recettes du dossier viennent ensuite ; ces valeurs par défaut en dernier. Une ligne de recette contredite par les membres récents est qualifiée de périmée dans votre note, et n'est pas respectée.

1. Voir

vos fetch <vosId> --media        # un take hébergé que vous n'avez pas enregistré (doc + séquence chez vous)
vos pull <take> --media          # un répertoire take déjà lié à vos.so
vos folder pull <slug> --media   # les takes d'un projet, recettes incluses
vos plan <take> --style <seed doc.json|vosId>   # dans une série : le style du seed, par les données
vos digest <take> [--transcript whisper.json] [--style <seed>]

Lisez, dans cet ordre :

  1. digest.json → take (durée, page, présence curseur/micro), moments (id, type, fenêtres source/output, focus, rect, activité, proposé, dit), plan, doc.manual. Un take avec hasCursor: false (un take d'enregistreur de navigateur) ne liste que le début/fin/scènes : rythmez par activité, zoomez uniquement là où la demande nomme un endroit, et dites dans la note que le take n'avait pas de piste de curseur.
  2. sheet.png → les recadrages dans l'ordre chronologique, les ids gravés. C'est le film en un coup d'œil.
  3. m<nn>.crop.png pour les moments que la demande ou la recette rend décisifs ; m<nn>.full.png uniquement pour le contexte (quelle page, quelle section).

Lire un recadrage : ce qui est au point (un contrôle, un champ, un contenu) ; ce qu'il dit (le libellé, la valeur tapée) ; la conséquence du clic est-elle visible dans l'image du moment suivant ou dans un moment scene juste après ? Un scene est un saut de différence d'image (une navigation, un dialogue) ; regardez son image complète pour le nommer.

Deux choses que les recadrages disent et que la liste des clics ne dit pas : un groupe de clics dont le rect représente la majeure partie de l'image est un GLISSEMENT (visée, défilement, déplacement d'une chose), pas une cible ; et un intervalle "inactif" dont l'activité reste au-dessus de ~0,1 correspond à la VIDÉO EN LECTURE, pas à l'inactivité. Ni l'un ni l'autre ne souhaitent la proposition du planificateur.

Si un dossier est impliqué, lisez TOUS les .md qu'il contient (les siens et les hérités) avant de décider quoi que ce soit.

2. Narrer

Écrivez 3 à 6 temps forts dans vos notes de travail, chacun avec les ids de ses moments, ce qu'il MONTRE (à partir des recadrages) et à quoi il SERT (d'après la recette, le titre de la page, said, ou la demande). Exemple :

B1 m01-m04  la galerie : parcourir, choisir un programme   (ouvrir large, un zoom carton)
B2 m05-m06  Remix ouvre le studio                           (la scène est la récompense)
B3 m07-m12  boutons : cinq glissements de curseur sur le panneau de remix (un zoom tenu, 2× au milieu)
B4 m13-m14  le résultat se joue                             (relâcher, stabiliser)

Aucune demande accompagnait le take ? Inférez-en une à partir de l'enregistrement (ce qu'il montre, où il serait affiché, combien de temps il devrait durer) et ÉNONCEZ-LA dans la note de version, afin que l'humain corrige la demande avant le coupage lorsqu'elle est erronée.

Si la demande nomme un temps fort ("rendre la partie export plus nerveuse"), mappez-le d'abord aux ids des moments et ne touchez à rien en dehors d'eux.

3. Décider, par exception

Par temps fort, selon plan et la recette :

  • Zoom. Conservez l'étendue du planificateur lorsqu'elle cadre le temps fort ; fusionnez les propositions adjacentes en une seule étendue tenue lorsqu'elles correspondent à un seul temps fort (un zoom par temps fort, jamais par clic) ; supprimez une proposition sur un clic qui n'est pas un temps fort ; ajoutez une étendue sur un clic isolé que le planificateur a sauté lorsque le recadrage montre qu'il est le moment. Niveau à partir du rect : un petit contrôle veut 1,8-2,2, un panneau 1,4-1,6 ; lorsque la cible occupe la majeure partie de la largeur de l'image, la règle de cadrage décide du niveau, obéissez-y. cx/cy = le focus du moment. Les ids que vous créez : u1, u2… Dans un enregistrement d'éditeur, zoomez sur la PISTE où une étendue apparaît, jamais sur le canevas qui est glissé. Relâchez un zoom AVANT un clic qui permet de naviguer, afin que l'échange de page se joue en grand écran.
  • Vitesse. Conservez les propositions sur la saisie/l'inactivité/le défilement ; ajoutez 2×-3× sur un segment dont l'activité est faible et dont aucun temps fort n'a besoin, ou sous des groupes de glissement ; jamais sur le payoff d'un temps fort, jamais pendant la lecture.
  • Inclinaison. Uniquement si le style de caméra en a une (tiltStyle/la personnalité du style) et qu'un temps fort mérite une ponctuation. Une pose par ~5s, ±5..18°.
  • Coupe. Début et fin : coupez jusqu'à la première et la dernière chose qui compte (segments), en laissant ~0,5s de stabilisation à la fin. Les écrans de chargement sont supprimés.
  • Texte. Une légende par temps fort qui a quelque chose à dire, à une cadence (une toutes les 5-10s, 2,5-4s chacune, jamais deux à la fois), dans les mots du produit et l'intention de la vidéo ; en bas tiers y ≈ 0,82 ; secondes de SORTIE ; jamais au-dessus du contrôle cliqué (validate prévient). Donnez-lui une box lorsque le fond en dessous est clair (la timeline d'un éditeur l'est), et jugez chaque légende à son propre instant. Une seule légende par film est trop peu pour un film qui explique un flux ; zéro est juste uniquement lorsque la recette ou la demande dit pas de texte.
  • Style. Dans une série, vos plan --style <seed> AVANT de couper : il copie le zoomStyle/zoomParams/speedParams/tiltStyle/frame/cursor/cam/export du seed et re-planifie les étendues automatiques en dessous. Ne répétez jamais ces nombres dans une recette ; le doc du seed est leur maison.

Écrivez le patch comme des MODIFICATIONS à doc.json, jamais une réécriture. Conservez chaque champ que vous ne comprenez pas.

4. Vérifier

vos validate <take>                                   # propre ; LISEZ les avertissements de cadrage, corrigez-les
vos digest <take> --no-frames                         # après le retiming : nouveaux temps OUTPUT, mêmes images
vos frames <take> --at-moments --at-zooms --times 0,25%,50%,75%,100%
vos frames <take> --times <chaque début de légende + 1>   # chaque légende sur son propre fond
vos render <take> check.webm --range a..b --draft     # le temps fort qui a le plus changé

Jugez les arrêts sur image par rapport à la boucle de qualité dans https://vos.so/llms-full.txt et le barème du dossier : flou, chrome, curseur, lisibilité du texte, première et dernière image en tant qu'affiches ; l'image clé dans les 3s ; la fin stabilisée ; ≤1 changement de plan plein écran par ~5s (ffmpeg -vf "select='gt(scene,0.12)'" les compte). Un arrêt sur image moment-<id> et son <id>.crop.png partagent un id : "ce qui était là" à côté de "ce que le coupage montre".

5. Publier

vos push <take> --label "<quoi, impératif, ≤60 caractères>" --note "<la demande pour laquelle vous avez coupé ; les temps forts avec les secondes source ; ce que vous avez supprimé et ajouté>" [--folder <slug>]

La base provient de vos.json. 409 stale_base → vos pull, réappliquez par-dessus, republiez. 409 protected_conflict → conservez les valeurs de l'humain sauf si la demande nommait ce nœud (--override <id> seulement dans ce cas). Un 400 imprime le champ et sa limite. Ensuite GET /api/vos/<id>, suivez contentUrls.thumbnail, et REGARDEZ-LE avant de signaler comme terminé.

6. Recouper (l'humain a regardé)

vos pull imprime le résumé du diff de ce qu'ils ont changé ("zoom z3 : niveau 2,2→1,6 ; overlay c1 supprimé"). C'est le retour, dans les propres mots des données : recoupez ce que leurs MOTS ont demandé et rien que leurs MAINS ont déjà corrigé. Comptez les rounds. "Parfait" est leur mot et la seule sortie d'un seed.

7. Mémoriser (uniquement après que l'humain a approuvé un seed)

Archivez-le et rédigez les règles ; les nombres restent dans le doc du seed.

vos folder create "<série>" --desc "<à quoi cela sert, ≤200 caractères>"
vos folder move <vosId> --to <slug>
vos recipe push CUT.md --folder <slug>      # s'applique : takes, seed: <le vos id>
vos recipe push BRAND.md --folder <slug>    # s'applique : any, seed: none

Une recette est nommée en MAJUSCULES, comme CLAUDE.md : c'est le fichier que la collection lit avant de couper quoi que ce soit. Ce que vous archivez est stocké avec sa racine en majuscule de toute façon, donc le terminal et l'archive sont d'accord.

CUT.md dit ce qu'un nombre ne peut pas : le vocabulaire des temps forts, ce qui obtient une légende et ce qui ne l'obtient jamais, les durées de tenue, la convention de titre/fin, la plage de longueur, ce qu'il faut ignorer, et les décisions que l'humain a corrigées DANS le seed (lues à partir du diff). BRAND.md : typographie, palette, fond, musique, la voix de tout texte. Membres ultérieurs : tirez le dossier, digérez, planifiez --style à partir du seed, coupez selon CUT.md, publiez --folder ; une correction qui se répète entre deux membres (ou une que l'humain énonce pour tous) est ajoutée sous ## Notes de l'agent, datée, et la règle ci-dessus est réécrite pour correspondre (vos recipe push <file> --asset <id> remplace sur place ; le corps précédent est conservé). Ne réécrivez jamais les lignes du propriétaire en silence.

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

launch-kit

Ship the media with the release — one take of the real product becomes YouTube demo, Chrome Web Store screenshots/tiles, Product Hunt gallery, social cuts, and OG cards; verified kit.json manifest.

vos-authoring

Author a vos animation program (VosConfigJson) from scratch or debug one — declarative configs compiling into deterministic Three.js + GSAP-dialect animations on the MIT vos engine (@vosjs/core), validated locally with compileVosConfig. Covers the schema, dialect rules, 2D overlay elements, shaders, and params/presets knobs. Use when asked to write a vos animation program, create a VosConfigJson, make a programmatic motion graphic or logo animation, or fix a config that fails to compile or lint.

vos-create

Create vos programs in the user

vosjs/product-video

Record and produce the demo video of a website, app, or feature with the vos CLI — the agent scripts the click path (actions.json), the recording auto-plans zooms, and every editing decision is data in doc.json, so fixes are edits and re-renders, never re-recordings. Renders are deterministic; export is free up to 4K with no watermark. Use when asked to make a product video, demo video, screen recording of a URL or feature, or a marketing clip, including a product behind a login (the session ladder: mint one from the project's own test auth before asking anyone), or when a feature was verified in agent-browser and that walk should become a take. A whole release's asset set (store listing, Product Hunt gallery, social cuts) is the launch-kit skill, which records through this one.

vosjs/vos-footage

Hand a Remotion, HyperFrames, or any video composition a clean captured clip of the real product — recorded and auto-zoomed with the vos CLI, delivered as full-bleed footage with no chrome, and always backed by an editable take on the maker's shelf, which the handoff says. Use when a composition needs real product footage, app or site b-roll, "capture our app for the video", or a screen-recorded segment to drop into another tool's timeline.

vosjs/vos-migrate

Turn an existing Loom, Screen Studio, Cap, or plain mp4/webm screen demo into an editable vosso take — re-encode the file, synthesize the take's metadata, plan, and push, so the old demo becomes a living document you re-cut instead of a file you re-record. Use when asked to "convert this Loom", "migrate our old demos", "re-edit this mp4", "make our Screen Studio recording editable", or to bring any already-recorded demo into vosso.

vos-remix

Remix a vos.so gallery program into your own — fetch its config, edit the declared knobs or code locally, validate with vos check, and push a private copy back with lineage that iterates as versions. Carries the params/Looks doctrine and the GLB 3D-showcase recipe. Use when asked to remix, customize or personalize a gallery animation, swap a 3D model into a showcase, or iterate a fetched program as versions.

Skills associés