# Agents vs Commandes vs Skills — Quand utiliser quoi Une comparaison des trois mécanismes d'extension de Claude Code : sous-agents, commandes et skills.
← Retour à Claude Code Best Practice Claude
![Menu slash montrant time-skill, time-command et time-agent](../../reports/assets/agent-command-skill-1.jpg) --- ## En un coup d'œil | | Agent | Commande | Skill | |---|---|---|---| | **Emplacement** | `.claude/agents/.md` | `.claude/commands/.md` | `.claude/skills//SKILL.md` | | **Contexte** | Processus de sous-agent séparé | Inline (conversation principale) | Inline (conversation principale) | | **Invocable par l'utilisateur** | Pas de menu `/` — invoqué par Claude ou via l'outil Agent | Oui — `/command-name` | Oui — `/skill-name` (sauf `user-invocable: false`) | | **Auto-invoqué par Claude** | Oui — via le champ `description` | Non | Oui — via le champ `description` (sauf `disable-model-invocation: true`) | | **Accepte des arguments** | Via le paramètre `prompt` | `$ARGUMENTS`, `$0`, `$1` | `$ARGUMENTS`, `$0`, `$1` | | **Injection de contexte dynamique** | Non | Oui — `` !`command` `` | Oui — `` !`command` `` | | **Fenêtre de contexte propre** | Oui — isolée | Non — partage la principale | Non — partage la principale (sauf `context: fork`) | | **Surcharge de modèle** | Frontmatter `model:` | Frontmatter `model:` | Frontmatter `model:` | | **Restrictions d'outils** | `tools:` / `disallowedTools:` | `allowed-tools:` | `allowed-tools:` | | **Hooks** | Frontmatter `hooks:` | — | Frontmatter `hooks:` | | **Mémoire** | Frontmatter `memory:` (user/project/local) | — | — | | **Peut précharger des skills** | Oui — frontmatter `skills:` | — | — | | **Serveurs MCP** | Frontmatter `mcpServers:` | — | — | --- ## Quand utiliser chacun ### Utilise un Agent quand : - La tâche est **autonome et multi-étapes** — l'agent doit explorer, décider et agir sans guidage constant - Tu as besoin d'**isolation de contexte** — le travail ne doit pas polluer la fenêtre de conversation principale - L'agent a besoin de **mémoire persistante** entre les sessions (par ex. un relecteur de code qui apprend des patterns) - Tu veux **précharger de la connaissance de domaine** via des skills sans encombrer le contexte principal - La tâche bénéficie d'une **exécution en arrière-plan** ou dans un **worktree git** - Tu as besoin de **restrictions d'outils** ou d'un **mode de permissions différent** (par ex. `acceptEdits`, `plan`) **Exemple** : `weather-agent` — récupère de façon autonome les données météo via son skill préchargé `weather-fetcher`, tourne dans un contexte séparé avec des outils restreints. ### Utilise une Commande quand : - Tu as besoin d'un **point d'entrée initié par l'utilisateur** — un workflow que l'utilisateur déclenche explicitement - Le workflow implique d'**orchestrer** d'autres agents ou skills - Tu veux **garder le contexte léger** — le contenu de la commande n'est pas injecté dans le contexte de session tant que l'utilisateur ne la déclenche pas **Exemple** : `weather-orchestrator` — l'utilisateur le déclenche, il demande la préférence C/F, invoque l'agent, puis invoque le skill SVG. ### Utilise un Skill quand : - Tu veux que **Claude auto-invoque** selon l'intention de l'utilisateur — les descriptions de skills sont injectées dans le contexte de session pour une correspondance sémantique - La tâche est une **procédure réutilisable** invocable depuis plusieurs endroits (commandes, agents, ou Claude lui-même) - Tu as besoin de **préchargement d'agent** — intégrer de la connaissance de domaine dans un agent spécifique au démarrage **Exemple** : `weather-svg-creator` — Claude l'auto-invoque quand l'utilisateur demande une carte météo ; aussi appelable depuis des commandes. --- ## L'architecture Commande → Agent → Skill Ce dépôt démontre un pattern d'orchestration en couches : ``` L'utilisateur déclenche /command ↓ La commande orchestre le workflow ↓ La commande invoque l'Agent (contexte séparé, autonome) ↓ L'Agent utilise le Skill préchargé (connaissance de domaine) ↓ La commande invoque le Skill (inline, pour la génération de sortie) ``` **Exemple concret** — le système météo : ``` /weather-orchestrator (commande — point d'entrée, demande C/F) ↓ weather-agent (agent — récupère la température de façon autonome) ├── weather-fetcher (skill d'agent — instructions API préchargées) ↓ weather-svg-creator (skill — crée le SVG inline) ``` --- ## Comparaison des frontmatters ### Frontmatter d'Agent ```yaml --- name: my-agent description: Use this agent PROACTIVELY when... tools: Read, Write, Edit, Bash model: sonnet maxTurns: 10 permissionMode: acceptEdits memory: user skills: - my-skill --- ``` ### Frontmatter de Commande ```yaml --- description: Do something useful argument-hint: [issue-number] allowed-tools: Read, Edit, Bash(gh *) model: sonnet --- ``` ### Frontmatter de Skill ```yaml --- name: my-skill description: Do something when the user asks for... argument-hint: [file-path] disable-model-invocation: false user-invocable: true allowed-tools: Read, Grep, Glob model: sonnet context: fork agent: general-purpose --- ``` --- ## Distinctions clés ### Auto-invocation | Mécanisme | Claude peut-il auto-invoquer ? | Comment l'empêcher | |-----------|------------------------|----------------| | Agent | Oui — via `description` (utilise « PROACTIVELY » pour l'encourager) | Retire ou adoucis la description | | Commande | Non — toujours initiée par l'utilisateur via `/` | N/A | | Skill | Oui — via `description` | Mets `disable-model-invocation: true` | ### Visibilité dans le menu `/` | Mécanisme | Apparaît dans le menu `/` ? | Comment masquer | |-----------|---------------------|-------------| | Agent | Non | N/A | | Commande | Oui — toujours | Ne peut être masquée | | Skill | Oui — par défaut | Mets `user-invocable: false` | ### Isolation de contexte | Mécanisme | Tourne dans son propre contexte ? | Comment configurer | |-----------|---------------------|-----------------| | Agent | Toujours | Comportement intégré | | Commande | Jamais | N/A | | Skill | Optionnel | Mets `context: fork` | --- ## Exemple traité : « Quelle est l'heure actuelle ? » Ce dépôt a les trois mécanismes définis pour la même tâche — afficher l'heure actuelle en PKT. Voici ce qui se passe quand un utilisateur tape **« What is the current time? »** sans invoquer explicitement une commande `/` : | Mécanisme | Va-t-il se déclencher ? | Pourquoi / Pourquoi pas | |-----------|--------------|---------------| | `time-command` | Non | Les commandes ne sont **jamais auto-invoquées**. L'utilisateur devrait taper explicitement `/time-command` pour l'exécuter. Les commandes n'ont pas de voie d'auto-découverte — elles sont strictement initiées par l'utilisateur. | | `time-agent` | **Oui** (possible) | La `description` de l'agent dit *« Use this agent to display the current time in Pakistan Standard Time »*. Claude la met en correspondance avec l'intention de l'utilisateur et peut l'instancier via l'outil Agent. Cependant, les agents tournent dans une **fenêtre de contexte séparée**, les rendant plus lourds que nécessaire pour cette tâche simple. | | `time-skill` | **Oui** (le plus probable) | La `description` du skill dit *« Display the current time in Pakistan Standard Time (PKT, UTC+5). Use when the user asks for the current time, Pakistan time, or PKT. »* Claude la met en correspondance et l'invoque via l'outil Skill. Comme il tourne **inline** sans surcoût de contexte, c'est la correspondance la plus efficace. | ### Ordre de résolution Quand plusieurs mécanismes correspondent à la même intention, Claude préfère l'**option la plus légère** qui satisfait la requête : ``` 1. Skill (inline, sans surcoût de contexte) ← préféré 2. Agent (contexte séparé, autonome) ← utilisé si le skill est indisponible ou la tâche complexe 3. Commande (jamais — requiert un / explicite) ← uniquement si l'utilisateur tape /time-command ``` ### Et si `disable-model-invocation: true` était défini sur le skill ? Alors Claude **ne peut pas** auto-invoquer le skill. L'agent devient la seule option auto-invocable, donc Claude instancierait `time-agent` à la place — au prix d'une fenêtre de contexte séparée pour une commande bash d'une ligne. ### Et si skill et agent avaient tous deux l'auto-invocation désactivée ? Alors **rien ne se déclenche automatiquement**. Claude se rabattrait sur sa propre connaissance générale et lancerait probablement juste `TZ='Asia/Karachi' date` directement — aucun mécanisme d'extension impliqué. L'utilisateur devrait taper explicitement `/time-command` ou `/time-skill` pour en utiliser un. ![Claude auto-invoquant time-skill quand l'utilisateur demande « What is the current time? »](../../reports/assets/agent-command-skill-2.png) --- ## Sources - [Skills Claude Code — Documentation](https://code.claude.com/docs/en/skills) - [Sous-agents Claude Code — Documentation](https://code.claude.com/docs/en/sub-agents) - [Commandes slash Claude Code — Documentation](https://code.claude.com/docs/en/slash-commands) - [Bonnes pratiques — Skills](../best-practice/claude-skills.md) - [Bonnes pratiques — Commandes](../best-practice/claude-commands.md) - [Bonnes pratiques — Sous-agents](../best-practice/claude-subagents.md)