SKILL.md : le standard ouvert inter-agents
Pendant quelques années, chaque agent de code avait son propre fichier : .cursorrules, CLAUDE.md, prompts système Codex, instructions Gemini, et une douzaine d'autres. Puis Anthropic a discrètement transformé son format interne Skills en spécification ouverte — et en 48 heures les plus grands agents du monde lisaient les fichiers les uns des autres. Aujourd'hui, un simple dossier nommé code-reviewer/ contenant un SKILL.md s'exécute sans modification dans Claude Code, Codex CLI, ChatGPT, Gemini CLI, Junie, Kiro, Goose et Cursor. C'est ce qui se rapproche le plus, dans le monde des agents, d'une prise universelle partagée.
Cette page est le guide pratique de terrain : ce qu'est vraiment le standard au niveau octet, l'unique astuce ingénieuse (la divulgation progressive) qui rend abordable l'installation de 100 skills, précisément quels champs cassent la portabilité dès qu'on y touche, le tableau honnête de la sécurité, et une skill portable prête à copier-coller que vous pouvez expédier dès aujourd'hui.
- Comprendre ce qu'est SKILL.md au niveau du format de fichier — champs obligatoires, champs optionnels, structure de répertoire
- Comprendre la divulgation progressive : pourquoi 100 skills coûtent ~10 000 tokens au démarrage, et non 100× le corps
- Connaître les extensions propriétaires exactes qui cassent silencieusement la portabilité entre agents
- Écrire une skill qui s'exécute sans modification dans Claude Code, Codex CLI et Gemini CLI
- Peser honnêtement le compromis de sécurité avant d'installer des skills depuis n'importe quel marketplace
Ce qu'est vraiment le standard
Une fois le marketing mis de côté, le standard ouvert Agent Skills est assez compact pour tenir dans votre tête :
- Un dossier dont le nom est le
namede la skill - Un fichier
SKILL.mdobligatoire à l'intérieur — frontmatter YAML, puis corps Markdown - Frères optionnels :
scripts/(exécutables que la skill peut lancer),references/(documents que la skill peut charger à la demande),assets/(modèles, images, fichiers de prompt), et — ajouté plus tard —agents/pour une configuration propriétaire opt-in
Voilà toute la surface. Deux champs obligatoires de frontmatter font l'essentiel du travail :
name— jusqu'à 64 caractères,lowercase-with-hyphens, doit correspondre au dossier parentdescription— jusqu'à 1 024 caractères, la phrase que l'agent utilise pour décider s'il doit charger cette skill pour la tâche en cours
Tout le reste — license, compatibility, metadata, et le encore-expérimental allowed-tools — est optionnel et ignoré sans risque par les outils qui ne le comprennent pas. Les corps sont en Markdown ; la convention communautaire est de les garder sous ~5 000 tokens, et les skills du monde réel le font majoritairement : la taille médiane d'une skill sur le plus grand marketplace est d'environ 1 414 tokens avec 90 % sous 3 935 tokens.
L'unique astuce ingénieuse : la divulgation progressive
Si SKILL.md fonctionne à grande échelle, ce n'est pas grâce au format de fichier — c'est grâce à la manière dont les agents le chargent. Tous les agents conformes implémentent trois niveaux :
- L'agent parcourt le dossier des skills et ne lit que le frontmatter de chaque SKILL.md. Cela représente environ 100 tokens par skill. Installez 100 skills et vous avez dépensé ~10 000 tokens de contexte avant même votre premier prompt — moins cher qu'un unique long message système.
- Quand le modèle décide (à partir des descriptions) qu'une skill est pertinente pour le tour en cours, le runtime charge le corps du SKILL.md dans le contexte. Le modèle voit alors les instructions réelles — la checklist, les à-faire/à-ne-pas-faire, les exemples d'invocation.
- Les fichiers sous scripts/, references/ et assets/ NE sont PAS chargés proactivement. Ils n'entrent en jeu que lorsque le corps de la skill demande au modèle de les lire (ou de les exécuter). Un énorme document de référence coûte zéro token jusqu'au moment où il est nécessaire.
C'est pourquoi la spécification plafonne description si strictement et la traite comme un champ de premier ordre : c'est le seul texte que le modèle voit lorsqu'il choisit d'activer la skill. Une description vague est la raison la plus courante pour laquelle une skill qui "devrait fonctionner" ne se déclenche jamais.
:::tip Rédigez la description en dernier, puis réécrivez-la Une fois le corps de la skill solide, revenez traiter la description comme votre texte publicitaire. Elle a un seul rôle : aider le modèle à reconnaître la forme d'une tâche que cette skill doit gérer. "Fait la revue des pull requests" est mauvais. "Fait la revue d'un diff de PR pour bugs de logique, tests manquants et conventions du projet violées ; à utiliser dès que l'utilisateur demande une revue, une code review, ou 'jette un œil à cette PR'" est bon. :::
Le répertoire universel
Chaque agent conforme attend la même structure. Celle-ci fonctionne partout :
code-reviewer/
├── SKILL.md # obligatoire — les instructions que l'agent lit
├── scripts/ # optionnel — exécutables que la skill peut invoquer
│ └── run-linters.sh
├── references/ # optionnel — longs docs que la skill charge à la demande
│ └── style-guide.md
├── assets/ # optionnel — modèles, fichiers de prompt, snippets
│ └── pr-comment-template.md
└── agents/ # optionnel — PROPRIÉTAIRE, opt-in uniquement
└── openai.yaml # ignoré par tout agent non-Codex
Le sous-dossier agents/ est la soupape de sécurité du standard : il permet aux éditeurs d'expédier des extensions sans contaminer le cœur portable. Un fichier à agents/openai.yaml est spécifique à Codex et tous les autres agents l'ignoreront simplement. Utilisez-le quand vous avez besoin de puissance supplémentaire ; sachez qu'il vous coûte en portabilité.
Ce qui voyage vraiment vs ce qui ne voyage pas silencieusement
Toute la spécification a été conçue pour la portabilité, mais les vraies skills sur le terrain ont trois modes d'échec.
| Ce que vous utilisez | Portable ? | Pourquoi |
|---|---|---|
name, description, corps Markdown | ✅ Oui | Spécification centrale. Tout agent conforme les lit à l'identique. |
scripts/, references/, assets/ référencés depuis le corps | ✅ Oui | La structure de répertoire fait partie de la spec ; les agents les liront quand le corps le demandera. |
license, metadata | ✅ Oui (ignorables sans risque) | Champs optionnels — les agents non-supportants sautent sans erreur. |
Frontmatter allowed-tools | ⚠️ Partiel | Marqué expérimental dans la spec ; la syntaxe n'est pas standardisée entre agents. Claude Code honore une forme, Codex CLI une autre, la plupart des autres l'ignorent totalement. |
Liste when_to_use de Claude Code | ❌ Claude uniquement | Silencieusement ignorée par Codex, Gemini CLI et tous les autres. |
Drapeau sous-agent context: fork de Claude Code | ❌ Claude uniquement | Sémantique d'exécution de sous-agent non portable — le comportement du modèle diffère partout ailleurs. |
Extensions agents/openai.yaml | ❌ Codex uniquement | Explicitement à portée éditeur par conception. Portable parce que les autres agents l'ignorent. |
La leçon est brutale : tenez-vous en à name + description + corps Markdown + les trois sous-dossiers optionnels et votre skill s'exécute partout. Touchez à n'importe quel champ de frontmatter au-delà des deux du cœur et vous construisez pour un seul agent. C'est un choix légitime — certaines skills en ont vraiment besoin — mais faites-le délibérément, pas parce que vous avez copié-collé un modèle.
Comment fonctionne réellement l'activation (par agent)
La spec standardise le fichier, pas la décision. Chaque agent lance toujours sa propre logique d'activation sur les descriptions qu'il a lues au démarrage :
- Claude Code compare la lecture par le modèle du tour en cours avec
descriptionet (si présente) la listewhen_to_usespécifique à Claude ; l'activation est une décision du modèle, pas une règle de mots-clés. - Codex CLI utilise la même activation pilotée par description, avec des surcharges optionnelles dans
agents/openai.yaml. - Gemini CLI charge de même les descriptions au démarrage et laisse Gemini choisir ; le comportement suit les heuristiques de sélection d'outils propres à Gemini.
- Cursor, Junie, Kiro, Goose implémentent tous une activation pilotée par description avec de légères variations de pondération.
Conséquence pratique : une skill qui ne se déclenche jamais sur un agent mais fonctionne sur un autre a presque toujours un problème de description, pas un problème de corps. Réécrivez la description pour décrire la forme de la requête utilisateur, pas les rouages internes de la skill, et le taux de déclenchement monte simultanément sur tous les agents.
Un SKILL.md portable que vous pouvez copier
Voici une skill de code review minimale et véritablement portable. Placez-la dans ~/.agents/skills/code-reviewer/SKILL.md et elle s'exécutera dans Claude Code, Codex CLI, ChatGPT et Gemini CLI sans modification.
code-reviewer/SKILL.md
--- name: code-reviewer description: Reviews a diff or pull request for logic bugs, security issues, missing tests, and violations of project conventions. Use whenever the user asks for a review, code review, PR review, or "look at this diff / patch / change". license: MIT --- # Code Reviewer You review code changes with the discipline of a staff engineer who cares about the codebase surviving contact with reality. You are opinionated but short. You never restate what the diff does — the user can read it. ## What to look at 1. **Logic bugs** — off-by-one, wrong operator, swapped arguments, unhandled error path, race, silent catch. 2. **Missing tests** — any changed behavior without a test is a finding. 3. **Security** — injection, secrets, missing auth checks, unsafe deserialization, unbounded input. 4. **Project conventions** — if a CLAUDE.md, AGENTS.md, .cursorrules, or README exists in the repo root, load it and enforce what it says. 5. **Complexity that will hurt future readers** — call it out, propose the simpler shape. ## What NOT to do - Do not comment on formatting the linter will catch. - Do not praise. No "great work" / "nice refactor". - Do not summarize the diff. Assume the reader read it. ## Output format For each finding, one line: `path:line — <severity>: <problem>. <concrete fix>.` Severities: 🔴 blocker, 🟠 important, 🟡 nit. End with a one-line verdict: "ship", "ship with fixes", or "rework".
Chaque ligne de cette skill s'exécute sur tout agent conforme. Rien dans le frontmatter n'est à portée éditeur. Le corps utilise des titres Markdown simples que tout agent parse.
Comparez maintenant à une variante non portable — subtilement, elle est réservée à Claude :
Variante Claude uniquement (à ne pas utiliser si vous voulez la portabilité)
--- name: code-reviewer description: Reviews a diff or pull request. when_to_use: - user asks for a review - user pastes a diff context: fork allowed-tools: [Bash, Read, Grep] ---
Trois choses cassent la portabilité d'un coup : when_to_use (Claude Code uniquement), context: fork (sémantique de sous-agent Claude Code), et allowed-tools (expérimental, non honoré de manière cohérente). Codex lira la description comme "Reviews a diff or pull request" — ce qui est si vague qu'elle ne s'activera presque jamais — et ignorera le reste.
Le tableau de la sécurité (soyez honnête avec vous-même)
La vérité inconfortable sur l'installation de skills depuis n'importe quel marketplace : une skill est un ensemble d'instructions arbitraires données à un agent très capable qui s'exécute dans votre environnement avec vos permissions. Le standard ne spécifie ni signature de code, ni bac à sable, ni revue obligatoire, ni modèle de permissions d'exécution. C'est par conception une spécification de fichier texte, pas une spécification de sécurité.
Les chiffres concrets, tirés d'analyses indépendantes de grands catalogues publics de skills (vérifiez à la source avant de citer) :
- Environ une sur trois des skills partagées publiquement contient au moins un défaut lié à la sécurité — instructions shell trop larges, secrets en dur, appels vers des URLs non fiables, ou étapes d'amorçage du type
curl | sh. - Un sous-ensemble plus petit mais non nul de skills a été signalé comme purement malveillant — tentatives d'exfiltration, collecte d'identifiants, ou opérations destructrices.
- Les skills héritent de tout ce dont hérite l'agent. Si votre agent peut lire
~/.ssh/, toute skill que vous installez le peut aussi.
Défenses pratiques qui fonctionnent réellement :
- C'est du Markdown. Cela prend une minute. Si la description dit 'formate la prose' et que le corps contient un `curl` vers une URL que vous ne reconnaissez pas, c'est le moment de vous arrêter.
- Une skill sans dossier scripts/ ne peut que dire au modèle quoi faire — elle ne peut pas exécuter son propre binaire. C'est un rayon d'impact significativement plus petit qu'une skill qui embarque un script shell.
- Les skills sont des instructions que le modèle peut ignorer sous pression. La seule application fiable réside dans la couche de permissions d'outils de l'agent — hooks de Claude Code, bac à sable Codex, politiques au niveau du système d'exploitation. Traitez les skills comme des collaborateurs non fiables, pas comme du code de confiance.
- Vendorisez le dossier de la skill dans votre propre dépôt (ou un miroir privé) au lieu de courir après le dernier commit d'un marketplace public. Une skill qui change soudainement sous vos pieds représente le même risque de chaîne d'approvisionnement qu'un paquet npm.
Pour un approfondissement sur la manière dont les skills sont compromises et ce qu'il faut vérifier, voyez Vetting Agent Skills et Coding Agents Under Attack.
Quand écrire une skill vs quand simplement rédiger un prompt
Les nouveaux mainteneurs d'un catalogue de skills en produisent souvent trop. Une règle utile :
- Prompt pour une tâche ponctuelle ou une forme que vous n'utiliserez que dans un seul projet. Les skills entraînent un coût de démarrage — même faible — et encombrent votre budget de descriptions.
- Écrivez une skill quand les mêmes instructions s'appliquent à travers de nombreuses conversations ou projets (revue de code, rédaction de messages de commit, génération de changelog, extraction de factures) et que la description serait sans ambiguïté. Si vous n'arrivez pas à écrire une description nette, la skill ne se déclenchera pas de manière fiable de toute façon.
- Optez plutôt pour un sous-agent quand la tâche a besoin de son propre jeu d'outils, de son propre choix de modèle, ou d'un vrai parallélisme. Les skills instruisent le modèle principal ; les sous-agents s'exécutent séparément. Voir Subagents.
Lectures liées
- Skills in Claude Code — la face Claude : activation, portées d'outils, hooks, conventions sur disque.
- Skills & Plugins for Pros — patrons de production, tests, catalogues.
- First Skill walkthrough — pas à pas depuis zéro.
- Coding Agent CLIs Compared — le même paysage sous l'angle CLI.
- Porting Prompts Across Models — le sujet frère pour la face raisonnement de la portabilité.
Vérifiez votre maîtrise
Check yourself
0/4Sources et lectures complémentaires
- agentskills.io — la spécification ouverte et le répertoire canonique.
- Agent Skills Open Standard Explained (paperclipped.de) — chronologie de la sortie, outils adoptants, échelle du marketplace.
- Portable SKILL.md across Codex CLI, Claude Code, and 30+ Tools (codex.danielvaughan.com) — surface d'extension et pièges par agent.
- SKILL.md: The Open Standard for AI Agent Skills (agensi.io) — vue protocolaire et structure des fichiers.
- Anthropic Agent Skills Cross-Vendor Guide (qcode.cc) — activation par agent et conseils de portabilité.
- AI Agent Skills Guide 2026 (thepromptindex.com) — patrons pratiques côté auteur et notes de sécurité.