20 points par GN⁺ 2025-07-02 | 4 commentaires | Partager sur WhatsApp
  • La fonctionnalité de hooks personnalisés a été ajoutée à Claude Code. Elle permet de contrôler le comportement de l’application de façon plus précise et répétable, sans dépendre des choix du LLM
  • Elle permet divers types d’automatisation comme la personnalisation des notifications, le formatage automatique du code et le suivi des journaux de commandes
  • Les hooks peuvent s’exécuter avant/après l’exécution d’une commande, lors de l’envoi d’une notification, ou à la fin d’une réponse, et être gérés au niveau projet, utilisateur ou entreprise via des fichiers de configuration
  • Grâce à la structure du fichier de configuration et au mécanisme de matcher, il est possible de n’exécuter que certains hooks au moment d’appels d’outils spécifiques
  • L’entrée est transmise au format JSON, et la sortie contrôle le résultat et le feedback via un code de sortie ou du JSON
  • Les hooks exécutent automatiquement des commandes shell avec l’ensemble des privilèges de l’utilisateur, ce qui impose une vigilance particulière en matière de sécurité et de sûreté

Introduction

  • Les hooks de Claude Code sont des commandes shell personnalisées exécutées automatiquement à chaque étape du cycle de vie de l’exécution du code
  • Ils permettent une automatisation cohérente à chaque exécution, plutôt que de s’en remettre à des décisions optionnelles du LLM
  • Exemples d’usage principaux

    • Notifications : fournir à l’utilisateur des notifications personnalisées lorsqu’une saisie est attendue
    • Formatage automatique : exécuter automatiquement prettier ou gofmt après modification de fichiers
    • Journalisation : enregistrer et agréger les commandes exécutées pour le suivi ou le débogage
    • Feedback : fournir automatiquement un retour lorsque du code généré ne respecte pas les règles du codebase
    • Autorisations personnalisées : bloquer les modifications sur des répertoires sensibles ou des fichiers de production
  • Comme ils s’exécutent dans du code système et non via un prompt, ils sont déclenchés de manière déterministe à chaque fois → fiabilité accrue de l’automatisation
  • Les hooks exécutent directement des commandes shell avec l’ensemble des privilèges de l’utilisateur ; une validation de sécurité est donc nécessaire.

Exemple de configuration

  • Exemple : enregistrer un hook pour que Claude écrive un log avant chaque exécution d’une commande Bash
    1. Accéder au menu de configuration des hooks avec la commande /hooks, puis sélectionner l’événement PreToolUse
    2. Ajouter le matcher Bash (appliqué uniquement aux commandes Bash)
    3. Enregistrer la commande du hook puis sauvegarder (si l’emplacement User settings est choisi, cela s’applique à tous les projets)
    4. Vérifier la configuration avec /hooks ou inspecter directement le fichier ~/.claude/settings.json

Structure de configuration

  • Les hooks sont regroupés selon des matchers, et chaque matcher peut contenir plusieurs hooks sous forme de tableau
    • Exemples : chaîne unique (correspondance exacte), expression régulière, ou vide pour s’appliquer à tous les événements
  • Types de fichiers de configuration
    • ~/.claude/settings.json : configuration utilisateur globale
    • .claude/settings.json : configuration du projet
    • .claude/settings.local.json : configuration locale (non partagée)
    • configuration de politique d’entreprise

Principaux événements de hook

  • PreToolUse : exécuté avant l’appel d’un outil, avec possibilité de bloquer l’exécution si nécessaire (matchers principaux : Bash, Write, Edit, Grep, etc.)
  • PostToolUse : exécuté juste après l’exécution d’un outil, avec prise en charge des mêmes matchers
  • Notification : exécuté lors de l’envoi d’une notification
  • Stop : exécuté après la fin de la réponse

Exemples de matchers

  • Task : tâche d’agent
  • Bash : commande shell
  • Glob : correspondance de motifs de fichiers
  • Grep : recherche dans le contenu
  • Read : lecture de fichier
  • Edit, MultiEdit : modification de fichier
  • Write : écriture de fichier
  • WebFetch, WebSearch : opérations web

Formats d’entrée et de sortie

  • Entrée : JSON transmis via stdin (incluant les informations de session et les données propres à chaque événement)
    • Exemple : PreToolUse inclut tool_input, PostToolUse ajoute tool_response
  • Sortie :
    • code de sortie 0 : exécution normale, stdout est affiché à l’utilisateur
    • code de sortie 2 : blocage, stderr est transmis à Claude comme feedback (dans PreToolUse, cela bloque l’exécution de l’outil)
    • autres codes : erreur, seul stderr est affiché à l’utilisateur
    • contrôle avancé : si stdout renvoie du JSON, il est possible de contrôler finement le flux avec "continue" à false ou "decision": "block", par exemple

Intégration avec les outils MCP

  • Les outils basés sur le Model Context Protocol (MCP) sont également pris en charge, et peuvent être ciblés sélectivement via un motif de nommage spécial (mcp____)

Recommandations de sécurité

  • Les hooks présentent un risque d’exécution de commandes système arbitraires ; des règles de sécurité comme la validation des entrées, la vérification des chemins, l’exclusion des fichiers sensibles et l’usage de chemins absolus sont donc indispensables
  • Les changements de configuration ne sont pas appliqués immédiatement : un instantané est utilisé au démarrage de la session, et un avertissement s’affiche en cas de modification externe

Environnement d’exécution et débogage

  • Chaque hook a une limite maximale de 60 secondes, s’exécute en parallèle et fonctionne dans le répertoire de travail et l’environnement courants
  • Il est possible de déboguer via /hooks en vérifiant la configuration, en testant directement les commandes et en contrôlant les codes de sortie et la sortie
  • Le déroulement de l’exécution et les résultats sont consultables dans le mode transcript (Ctrl-R)

4 commentaires

 
shakespeare 2025-07-02

Veuillez aussi sortir une version Windows, s’il vous plaît T_T

 
nalbam 2025-07-06

Utilisez WSL.

 
slowmo 2025-07-08

C’est peut-être à cause des performances modestes de mon PC, mais sous Windows WSL, certaines tâches avec Claude Code (par exemple le build d’un projet ou l’exécution d’un serveur web local) sont vraiment trop lentes.
Il est possible d’exécuter manuellement uniquement ces tâches en dehors de WSL, mais c’est pénible et contraignant, donc depuis la sortie de Gemini CLI, sous Windows j’utilise surtout Gemini CLI à la place de Claude Code.

 
GN⁺ 2025-07-02
Avis Hacker News
  • Claude Code Opus 4 a la fâcheuse habitude de ne pas ajouter de retour à la ligne en fin de fichier, ce qui est frustrant
    Comme il faut redémarrer claude pour tester un nouveau hook, il est bien plus efficace d’utiliser un script qui permet de continuer à éditer pendant la session
    Ce script applique un formateur aux fichiers C et aux scripts shell, et pour les autres fichiers il se contente de corriger les retours à la ligne manquants
    Les IA comme Claude sont faibles pour bien découper un problème et essaient parfois de faire les choses de manière étrange, donc j’ai dû corriger plusieurs fois en procédant comme dans l’exemple de hook ci-dessus : enregistrer le fichier JSON sur le disque, n’en extraire que le chemin, le sauvegarder de nouveau, puis passer ce chemin à save-hook.sh
    J’ai obtenu ce que je voulais en 10 minutes, mais j’ai perdu encore plus de temps à lui faire faire de gros changements d’un coup

  • On entend dire que l’IA va remplacer les développeurs, mais configurer ce genre de hooks et proposer de nouvelles fonctionnalités restera malgré tout le rôle des humains
    Ce type de travail lié au tooling continuera d’exister tant que l’IA n’aura pas évolué au point d’imaginer elle-même ce genre d’idée et de l’appliquer à d’autres IA

    • Pour reprendre une analogie avec le travail du bois, on est selon moi à un point de bascule entre les outils manuels et les outils électriques
      Quelqu’un qui maîtrise les bases saura bien manier les outils, mais au lieu de fabriquer finement à la main, on est désormais à l’étape où l’on travaille vite à la scie sur table : c’est plus efficace, mais aussi potentiellement plus dangereux

    • C’est similaire à l’idée selon laquelle l’arrivée de machines agricoles comme les moissonneuses-batteuses allait remplacer les emplois dans l’agriculture
      Est-il vraiment plausible que toute la main-d’œuvre se contente de devenir opératrice de machines ?
      Le point de vue ici est que, qu’il s’agisse d’outils d’automatisation, d’agriculture ou d’IA, la valeur ne se réduit pas à une simple conversion

    • Comme dans la fameuse histoire de « la Terre posée sur le dos d’une tortue », on peut répéter à l’infini, après l’apparition de l’IA, la question « et qui va gérer cette IA ? »
      Il existe déjà des cas où l’on confie à Claude Code la mise à jour de CLAUDE.md, donc lui faire modifier ses propres hooks n’est pas totalement impossible
      Mais il est intéressant de voir qu’on oublie facilement la question, à la Jurassic Park, de « devrait-on vraiment le faire ? »

    • L’idée que l’IA va réduire les emplois de développeur et la question de savoir qui configurera les hooks sont toutes deux valables
      Cela souligne que le progrès technique ne se résume pas simplement à une hausse ou une baisse du nombre d’emplois : il en supprime tout en en créant de nouveaux

    • En réalité, pour la plupart des gens, ce type de travail relève moins du développement que de la maintenance, du DevOps et d’activités similaires
      Même dans les produits SaaS, une grande partie du travail concerne davantage l’exploitation que le code, ce qui diffère du développement au sens fort auquel pensent les utilisateurs de HN

  • L’arrivée de cette fonctionnalité est vraiment enthousiasmante
    Les hooks devraient jouer un rôle important dans l’engineering du contexte des agents et la validation des performances à l’exécution
    Cela pourrait s’étendre à de nombreux cas d’usage, comme la conformité en entreprise ou la surveillance des comportements
    Il est aussi impressionnant qu’Anthropic l’ait pris en charge directement à partir d’une suggestion dans une issue GitHub
    Lien vers l’issue concernée

    • En pratique, j’utilise une extension VS Code appelée cline.bot à la place de Claude Code
      Je pense que ce genre de fonctionnalité va devenir une arme décisive généralisée à tous les agents de codage
  • Si cette fonctionnalité me plaît, c’est parce qu’elle permet d’écrire directement des règles de contrôle d’exécution de commandes complexes sans passer par un contournement via CLAUDE.md
    Par exemple,
    docker compose exec django python manage.py test
    peut être autorisé, tandis que
    docker compose exec django python manage.py makemigrations
    peut être bloqué

    • On peut déjà faire quelque chose de ce niveau dans .Claude/settings.json
  • J’aurais trouvé encore mieux que cette fonctionnalité fonctionne comme un serveur MCP en soi
    On pourrait définir à l’avance les hooks comme des outils MCP aux noms convenus, laisser l’agent découvrir automatiquement les hooks sans connaître leur implémentation interne, puis réutiliser le serveur MCP ou les recycler dans d’autres agents

  • Claude Code oublie souvent les instructions du fichier CLAUDE.md ainsi que les éléments importants de la base de code, donc il faut le lui rappeler régulièrement
    J’espère que cette mise à jour pourra corriger ce problème

    • Par exemple : « N’utilise pas de retour anticipé dans une fonction void ! CLAUDE.md dit bien que ce motif est interdit ! »
      Claude lit CLAUDE.md et répond : « 22 secondes, 2.6k tokens… »
      puis : « Vous avez raison ! »
  • Je partage quelques hooks d’exemple
    Article d’exemple sur l’écriture de hooks et l’automatisation des workflows
    C’est une bonne nouvelle de voir que Claude Code atteint le niveau de Cursor avec la prise en charge du linting et du contrôle de types après modification du code

  • J’aimerais que cette fonctionnalité arrive aussi dans Cursor
    Pour l’instant, je m’en sors à peu près en combinant plusieurs règles comme solution provisoire

    • Comme je n’utilise pas Cursor, je me demande toujours s’il y a encore une raison de l’utiliser
  • Je pense que cette fonctionnalité comble un écart fonctionnel important qui existait jusqu’ici
    Comme la manière dont Claude Code génère les commits empêche la plupart des hooks Git classiques de fonctionner, j’utilisais une astuce consistant à lui demander via CLAUDE.md d’automatiser le formatage du code avec Qlty CLI, mais Claude ne le faisait pas de manière fiable, ce qui était décevant
    Ce changement devrait permettre d’obtenir des résultats plus déterminants
    Les événements hookables sont encore limités pour l’instant, mais j’espère qu’il sera bientôt facile d’ajouter aussi des hooks sur les événements Git commit et push
    Lien GitHub de Qlty CLI

    • À noter que Claude est excellent en Java
      Il comprend parfaitement mon guide de style et même mes préférences d’indentation, au point que le reformatage du code Java devient inutile
      Il aligne même très bien la JavaDoc, ce qui m’a surpris
      Il a probablement été entraîné sur une quantité énorme de gros codes Java d’entreprise

    • Je me demande pourquoi les hooks Git classiques ne fonctionnent pas correctement dans claude code

    • Husky et lint-staged fonctionnaient normalement, mais les pre-commit hooks, eux, ne marchaient pas

  • Si je comprends bien, cette fonctionnalité ne consomme pas de contexte et, contrairement à MCP où c’est Claude qui décide quand exécuter quelque chose, il s’agit ici d’un mécanisme d’actions automatiques défini directement par l’utilisateur pour chaque usage d’outil