﻿﻿{"id":2659,"date":"2026-04-01T14:50:13","date_gmt":"2026-04-01T12:50:13","guid":{"rendered":"https:\/\/elearningsamba.com\/index.php\/fuite-claude-code-6-trucs-a-piquer-pour-vos-hooks\/"},"modified":"2026-04-01T14:50:13","modified_gmt":"2026-04-01T12:50:13","slug":"fuite-claude-code-6-trucs-a-piquer-pour-vos-hooks","status":"publish","type":"page","link":"https:\/\/elearningsamba.com\/index.php\/fuite-claude-code-6-trucs-a-piquer-pour-vos-hooks\/","title":{"rendered":"Fuite Claude Code &#8211; 6 trucs \u00e0 piquer pour vos hooks"},"content":{"rendered":"<p><strong>Le code source de Claude Code a fuit\u00e9 hier<\/strong>, et au-del\u00e0 du buzz, y&#8217;a, je trouve, quelques le\u00e7ons concr\u00e8tes \u00e0 tirer de tout \u00e7a.<\/p>\n<p>Alors rassurez-vous, je vais pas vous balancer du code TypeScript \u00e0 copier-coller (on n&#8217;est pas des cochons), ni des le\u00e7ons de morale sur ce qu&#8217;on peut ou pas pousser sur un d\u00e9p\u00f4t Git, mais plut\u00f4t vous lister des patterns d&#8217;architecture \/ bonnes pratiques que vous pouvez impl\u00e9menter d\u00e8s maintenant dans votre fichier <code>settings.json<\/code> via le syst\u00e8me de<br \/>\n<a href=\"https:\/\/code.claude.com\/docs\/en\/hooks-guide\">hooks de Claude Code<\/a><br \/>\n.<\/p>\n<p>Je reste vague techniquement, volontairement pour 2 raisons. D&#8217;abord parce qu&#8217;il y a eu fuite de code, donc je peux pas poster du code propri\u00e9taire ici. Et ensuite parce que chaque projet \/ boite \u00e0 outil qu&#8217;on se cr\u00e9e dans Claude Code ou ailleurs est diff\u00e9rente, donc ce sera \u00e0 vous (ou \u00e0 Claude en fait) d&#8217;adapter chacune de ces bonnes pratiques.<\/p>\n<p>Concr\u00e8tement, tout passe par le fichier <code>.claude\/settings.json<\/code> de votre projet (ou <code>~\/.claude\/settings.json<\/code> pour du global). Dedans, vous d\u00e9clarez des hooks, c&#8217;est-\u00e0-dire des scripts <code>.cjs<\/code> ou <code>.sh<\/code> qui se d\u00e9clenchent automatiquement \u00e0 des moments pr\u00e9cis : avant qu&#8217;un outil s&#8217;ex\u00e9cute (<code>PreToolUse<\/code>), quand vous tapez un message (<code>UserPromptSubmit<\/code>), apr\u00e8s un commit (<code>PostToolUse<\/code>), etc.<\/p>\n<p>Le script re\u00e7oit du JSON en stdin, fait son boulot, et renvoie un code de sortie : <code>0<\/code> pour laisser passer, <code>2<\/code> pour bloquer. Pas besoin de l&#8217;API Claude, pas besoin de tokens, \u00e7a tourne en local sur votre machine. H\u00e9 bien tout ce que vous allez lire ci-dessous, ce sera \u00e0 vous de l&#8217;impl\u00e9menter dans des scripts de ce type.<\/p>\n<p>Et le plus simple pour \u00e7a, c&#8217;est de donner les parties de mon article qui vous int\u00e9ressent \u00e0 votre propre Claude Code pour qu&#8217;il aille lui-m\u00eame faire les scripts cjs \/ sh et les bons appels de hooks dans le settings.json. Pourquoi se prendre la t\u00eate ?<\/p>\n<p>Et encore une fois, j&#8217;insiste, il s&#8217;agit de concepts d&#8217;ing\u00e9nierie logicielle, et pas de code propri\u00e9taire appartenant \u00e0 Anthropic.<\/p>\n<p>La premi\u00e8re bonne pratique c&#8217;est le <strong>circuit breaker<\/strong> ou disjoncteur en fran\u00e7ais&#8230;<\/p>\n<p>En gros, quand vos scripts JavaScript appellent des APIs genre l&#8217;endpoint <code>chat\/completions<\/code> d&#8217;OpenAI ou <code>generateContent<\/code> de Gemini, \u00e7a peut parfois ne pas r\u00e9pondre, parce que la vie quoi&#8230; ^^<\/p>\n<p>Et malheureusement, quand cela arrive, votre code continue de marteler l&#8217;endpoint en boucle, ce qui fait que vous cramez des tokens pour rien. Le fix est pourtant tr\u00e8s simple : <strong>Apr\u00e8s 3 \u00e9checs cons\u00e9cutifs, on coupe<\/strong>, et on passe au fallback. Netflix avait popularis\u00e9 \u00e7a avec leur librairie<br \/>\n<a href=\"https:\/\/github.com\/netflix\/hystrix\">Hystrix<\/a><br \/>\ny&#8217;a 10 ans, et c&#8217;est ce type de protection qu&#8217;on retrouve aujourd&#8217;hui dans Claude Code. Concr\u00e8tement, c&#8217;est un module Node.js de 40 lignes avec un compteur et un \u00e9tat ouvert\/ferm\u00e9 et comme \u00e7a, fini les retry storms !<\/p>\n<p>Deuxi\u00e8me pattern : le <strong>scanner de secrets en pre-commit<\/strong>.<\/p>\n<p>Un <code>git commit<\/code> qui embarque une cl\u00e9 API dans un <code>.env<\/code>, \u00e7a arrive trop souvent (demandez \u00e0 Anthropic et leur fichier <code>.map<\/code> de 60 Mo ^^). Le hook <code>PreToolUse<\/code> permet heureusement d&#8217;intercepter chaque <code>git commit<\/code> AVANT ex\u00e9cution. Votre script parcourt alors les fichiers stag\u00e9s via <code>git diff --cached<\/code>, cherche les patterns <code>sk-ant-api<\/code>, <code>ghp_<\/code>, <code>AKIA<\/code>, <code>-----BEGIN RSA PRIVATE KEY-----<\/code> et renvoie un <code>exit 2<\/code> pour bloquer.<\/p>\n<p>Perso, j&#8217;ai dans ma bo\u00eete \u00e0 outils IA, 18 regex dans un fichier <code>.claude\/hooks\/secret-scanner.cjs<\/code> qui couvrent Anthropic, OpenAI, AWS, GitHub, Slack, Stripe et les JWT. Par contre, attention aux faux positifs car un fichier contenant &#8220;sk-ant-api&#8221; dans un commentaire, \u00e7a bloquera tout. \u00c7a m&#8217;est d\u00e9j\u00e0 arriv\u00e9 et heureusement, l&#8217;IA est assez maligne pour comprendre d&#8217;o\u00f9 vient le blocage et \u00e9ventuellement passer outre si ce n&#8217;est pas justifi\u00e9.<\/p>\n<p>Et troisi\u00e8me truc sympa : la <strong>d\u00e9tection de frustration<\/strong>.<\/p>\n<p>En effet, un hook <code>UserPromptSubmit<\/code> se d\u00e9clenche quand vous tapez un message de rageux. Ainsi, si votre prompt contient &#8220;putain&#8221;, &#8220;\u00e7a marche pas&#8221; ou &#8220;wtf&#8221;, le hook injecte via stdout un contexte qui dit \u00e0 Claude d&#8217;aller droit au but. Comme \u00e7a, y&#8217;a plus de blabla et on part direct sur une solution concr\u00e8te.<\/p>\n<p>Et c&#8217;est pareil pour &#8220;continue&#8221; ou &#8220;finis&#8221; qui injecte &#8220;reprendre sans r\u00e9sumer&#8221; automatiquement. Franchement, c&#8217;est 30 lignes de JavaScript rikiki \u00e0 mettre dans <code>.claude\/hooks\/frustration-detector.cjs<\/code> et \u00e7a change carr\u00e9ment la vie quand vous \u00eates en mode debug \u00e0 2h du mat avec un caf\u00e9 dans la main gauche et un \u0153il qui se ferme tout seul en tremblant !<\/p>\n<p>Quatri\u00e8me bonne pratique : les <strong>tags @[MODEL]<\/strong> dans vos skills.<\/p>\n<p>Car vous le savez, certaines r\u00e8gles que vous avez mises en place existent uniquement \u00e0 cause d&#8217;un biais du mod\u00e8le actuel. Genre, Opus 4.6 qui colle ces putains de tirets cadratins (Unicode U+2014) partout. Du coup, \u00e7a oblige les gens \u00e0 mettre dans leurs skills une r\u00e8gle du genre &#8220;0 em-dash&#8221;. Sauf que le jour o\u00f9 Sonnet 5 ne les utilisera plus, cette r\u00e8gle ce sera du bruit inutile.<\/p>\n<p>Alors en taguant <code>@[OPUS-4.6]<\/code> dans un commentaire HTML, vous pourrez ensuite faire facilement un <code>grep -r \"@[OPUS\"<\/code> quand vous changez de mod\u00e8le. C&#8217;est du tracking de dette technique pour le prompt engineering, quoi&#8230; et perso, je n&#8217;y avais pas pens\u00e9 avant.<\/p>\n<p>Cinqui\u00e8me pattern : <strong>les seuils num\u00e9riques<\/strong>.<\/p>\n<p>Votre &#8220;<em>Fais des fonctions courtes<\/em>&#8221; dans un CLAUDE.md, \u00e7a ne veut rien dire pour un agent et malheureusement, la plupart des gens \u00e9crivent encore &#8220;<em>sois concis<\/em>&#8221; ou &#8220;<em>toi faire code propre<\/em>&#8221; sans aucun chiffre alors qu&#8217;un &#8220;<em>Max 50 lignes par fonction, couverture tests \u2265 80%, 0 warning ESLint<\/em>&#8221; c&#8217;est vachement plus efficace car v\u00e9rifiable par un script.<\/p>\n<p>Enfin, dernier pattern : la <strong>consolidation m\u00e9moire<\/strong>.<\/p>\n<p>Anthropic a mis en place un syst\u00e8me nomm\u00e9 <code>autoDream<\/code> qui tourne pendant l&#8217;inactivit\u00e9 de Claude Code pour nettoyer la m\u00e9moire. Il vire les doublons, r\u00e9sout les contradictions, v\u00e9rifie que les fichiers existent encore. Et m\u00eame s&#8217;il ne le r\u00e9clame pas parce qu&#8217;ils n&#8217;ont pas de bouche pour vous parler, vos CLAUDE.md de 200 lignes et vos JSON de 70 Ko ont besoin du m\u00eame traitement ! Donc il faut que vous ajoutiez une phase genre &#8220;dream&#8221; en bash ou Node.js \u00e0 la fin de vos workflows, comme \u00e7a, plut\u00f4t que de tout garder, le script scan le r\u00e9pertoire <code>~\/.claude\/<\/code>, trie les entr\u00e9es par date, et fusionne les doublons. C&#8217;est comme la consolidation pendant l&#8217;inactivit\u00e9, mais en 5 secondes sur un Apple M4.<\/p>\n<p>D&#8217;ailleurs, la communaut\u00e9 n&#8217;a pas perdu de temps. Un d\u00e9veloppeur a catalogu\u00e9 les<br \/>\n<a href=\"https:\/\/github.com\/paoloanzn\/free-code\/blob\/main\/FEATURES.md\">88 feature flags<\/a><br \/>\nplanqu\u00e9s dans le code, dont 54 qui compilent proprement (les autres d\u00e9pendent de modules internes d&#8217;Anthropic). Et un autre a reconstitu\u00e9<br \/>\n<a href=\"https:\/\/github.com\/NanmiCoder\/claude-code-haha\">8 diagrammes d&#8217;architecture<\/a><br \/>\ncomplets du pipeline : cycle de vie d&#8217;une requ\u00eate, syst\u00e8me de permissions, orchestration multi-agents&#8230; C&#8217;est la meilleure doc technique qui existe sur le fonctionnement interne de Claude Code, et elle ne vient pas d&#8217;Anthropic ^^<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/korben.info\/cdn-cgi\/image\/width=1200,fit=scale-down,quality=90,f=avif\/claude-code-6-patterns-bonnes-pratiques-hooks\/claude-code-6-patterns-bonnes-pratiques-hooks-2.png\" alt=\"\" loading=\"lazy\"><\/p>\n<p><strong>Architecture globale de Claude Code reconstitu\u00e9e par la communaut\u00e9<\/strong><\/p>\n<p>Voil\u00e0 et toutes ces pratiques, \u00e7a repose sur les 25 \u00e9v\u00e9nements du syst\u00e8me de hooks (<code>PreToolUse<\/code>, <code>PostToolUse<\/code>, <code>UserPromptSubmit<\/code>, <code>Stop<\/code>&#8230;) avec 3 types de handlers : <code>command<\/code> pour les scripts shell, <code>prompt<\/code> pour une \u00e9valuation LLM, et <code>agent<\/code> pour une v\u00e9rification multi-\u00e9tapes.<\/p>\n<p>Apr\u00e8s, si l&#8217;un de vos scripts plante comme une merde, le hook laissera passer des choses, donc pensez bien \u00e0 tester chaque retour de script avec un <code>echo '{}' | .\/mon-hook.sh &amp;&amp; echo $?<\/code> avant de d\u00e9ployer.<\/p>\n<p>Et voil\u00e0 ! Je vous invite \u00e0 lire<br \/>\n<a href=\"https:\/\/korben.info\/claude-code-fuite-code-source-npm-source-maps.html\">mon article sur la fuite<\/a><br \/>\npour plus d&#8217;infos.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le code source de Claude Code a fuit\u00e9 hier, et au-del\u00e0 du buzz, y&#8217;a, je trouve, quelques le\u00e7ons concr\u00e8tes \u00e0 tirer de tout \u00e7a. Alors rassurez-vous, je vais pas vous balancer du code TypeScript \u00e0 copier-coller (on n&#8217;est pas des cochons), ni des le\u00e7ons de morale sur ce qu&#8217;on peut ou pas pousser sur un d\u00e9p\u00f4t Git, mais plut\u00f4t vous lister des patterns d&#8217;architecture \/ bonnes pratiques que vous pouvez impl\u00e9menter d\u00e8s maintenant dans votre fichier settings.json via le syst\u00e8me de hooks de Claude Code . Je reste vague techniquement, volontairement pour 2 raisons. D&#8217;abord parce qu&#8217;il y a eu fuite de code, donc je peux pas poster du code propri\u00e9taire ici. Et ensuite parce que chaque projet \/ boite \u00e0 outil qu&#8217;on se cr\u00e9e dans Claude Code ou ailleurs est diff\u00e9rente, donc ce sera \u00e0 vous (ou \u00e0 Claude en fait) d&#8217;adapter chacune de ces bonnes pratiques. Concr\u00e8tement, tout passe par le fichier .claude\/settings.json de votre projet (ou ~\/.claude\/settings.json pour du global). Dedans, vous d\u00e9clarez des hooks, c&#8217;est-\u00e0-dire des scripts .cjs ou .sh qui se d\u00e9clenchent automatiquement \u00e0 des moments pr\u00e9cis : avant qu&#8217;un outil s&#8217;ex\u00e9cute (PreToolUse), quand vous tapez un message (UserPromptSubmit), apr\u00e8s un commit (PostToolUse), etc. Le script re\u00e7oit du JSON en stdin, fait son boulot, et renvoie un code de sortie : 0 pour laisser passer, 2 pour bloquer. Pas besoin de l&#8217;API Claude, pas besoin de tokens, \u00e7a tourne en local sur votre machine. H\u00e9 bien tout ce que vous allez lire ci-dessous, ce sera \u00e0 vous de l&#8217;impl\u00e9menter dans des scripts de ce type. Et le plus simple pour \u00e7a, c&#8217;est de donner les parties de mon article qui vous int\u00e9ressent \u00e0 votre propre Claude Code pour qu&#8217;il aille lui-m\u00eame faire les scripts cjs \/ sh et les bons appels de hooks dans le settings.json. Pourquoi se prendre la t\u00eate ? Et encore une fois, j&#8217;insiste, il s&#8217;agit de concepts d&#8217;ing\u00e9nierie logicielle, et pas de code propri\u00e9taire appartenant \u00e0 Anthropic. La premi\u00e8re bonne pratique c&#8217;est le circuit breaker ou disjoncteur en fran\u00e7ais&#8230; En gros, quand vos scripts JavaScript appellent des APIs genre l&#8217;endpoint chat\/completions d&#8217;OpenAI ou generateContent de Gemini, \u00e7a peut parfois ne pas r\u00e9pondre, parce que la vie quoi&#8230; ^^ Et malheureusement, quand cela arrive, votre code continue de marteler l&#8217;endpoint en boucle, ce qui fait que vous cramez des tokens pour rien. Le fix est pourtant tr\u00e8s simple : Apr\u00e8s 3 \u00e9checs cons\u00e9cutifs, on coupe, et on passe au fallback. Netflix avait popularis\u00e9 \u00e7a avec leur librairie Hystrix y&#8217;a 10 ans, et c&#8217;est ce type de protection qu&#8217;on retrouve aujourd&#8217;hui dans Claude Code. Concr\u00e8tement, c&#8217;est un module Node.js de 40 lignes avec un compteur et un \u00e9tat ouvert\/ferm\u00e9 et comme \u00e7a, fini les retry storms ! Deuxi\u00e8me pattern : le scanner de secrets en pre-commit. Un git commit qui embarque une cl\u00e9 API dans un .env, \u00e7a arrive trop souvent (demandez \u00e0 Anthropic et leur fichier .map de 60 Mo ^^). Le hook PreToolUse permet heureusement d&#8217;intercepter chaque git commit AVANT ex\u00e9cution. Votre script parcourt alors les fichiers stag\u00e9s via git diff &#8211;cached, cherche les patterns sk-ant-api, ghp_, AKIA, &#8212;&#8211;BEGIN RSA PRIVATE KEY&#8212;&#8211; et renvoie un exit 2 pour bloquer. Perso, j&#8217;ai dans ma bo\u00eete \u00e0 outils IA, 18 regex dans un fichier .claude\/hooks\/secret-scanner.cjs qui couvrent Anthropic, OpenAI, AWS, GitHub, Slack, Stripe et les JWT. Par contre, attention aux faux positifs car un fichier contenant &#8220;sk-ant-api&#8221; dans un commentaire, \u00e7a bloquera tout. \u00c7a m&#8217;est d\u00e9j\u00e0 arriv\u00e9 et heureusement, l&#8217;IA est assez maligne pour comprendre d&#8217;o\u00f9 vient le blocage et \u00e9ventuellement passer outre si ce n&#8217;est pas justifi\u00e9. Et troisi\u00e8me truc sympa : la d\u00e9tection de frustration. En effet, un hook UserPromptSubmit se d\u00e9clenche quand vous tapez un message de rageux. Ainsi, si votre prompt contient &#8220;putain&#8221;, &#8220;\u00e7a marche pas&#8221; ou &#8220;wtf&#8221;, le hook injecte via stdout un contexte qui dit \u00e0 Claude d&#8217;aller droit au but. Comme \u00e7a, y&#8217;a plus de blabla et on part direct sur une solution concr\u00e8te. Et c&#8217;est pareil pour &#8220;continue&#8221; ou &#8220;finis&#8221; qui injecte &#8220;reprendre sans r\u00e9sumer&#8221; automatiquement. Franchement, c&#8217;est 30 lignes de JavaScript rikiki \u00e0 mettre dans .claude\/hooks\/frustration-detector.cjs et \u00e7a change carr\u00e9ment la vie quand vous \u00eates en mode debug \u00e0 2h du mat avec un caf\u00e9 dans la main gauche et un \u0153il qui se ferme tout seul en tremblant ! Quatri\u00e8me bonne pratique : les tags @[MODEL] dans vos skills. Car vous le savez, certaines r\u00e8gles que vous avez mises en place existent uniquement \u00e0 cause d&#8217;un biais du mod\u00e8le actuel. Genre, Opus 4.6 qui colle ces putains de tirets cadratins (Unicode U+2014) partout. Du coup, \u00e7a oblige les gens \u00e0 mettre dans leurs skills une r\u00e8gle du genre &#8220;0 em-dash&#8221;. Sauf que le jour o\u00f9 Sonnet 5 ne les utilisera plus, cette r\u00e8gle ce sera du bruit inutile. Alors en taguant @[OPUS-4.6] dans un commentaire HTML, vous pourrez ensuite faire facilement un grep -r &#8220;@[OPUS&#8221; quand vous changez de mod\u00e8le. C&#8217;est du tracking de dette technique pour le prompt engineering, quoi&#8230; et perso, je n&#8217;y avais pas pens\u00e9 avant. Cinqui\u00e8me pattern : les seuils num\u00e9riques. Votre &#8220;Fais des fonctions courtes&#8221; dans un CLAUDE.md, \u00e7a ne veut rien dire pour un agent et malheureusement, la plupart des gens \u00e9crivent encore &#8220;sois concis&#8221; ou &#8220;toi faire code propre&#8221; sans aucun chiffre alors qu&#8217;un &#8220;Max 50 lignes par fonction, couverture tests \u2265 80%, 0 warning ESLint&#8221; c&#8217;est vachement plus efficace car v\u00e9rifiable par un script. Enfin, dernier pattern : la consolidation m\u00e9moire. Anthropic a mis en place un syst\u00e8me nomm\u00e9 autoDream qui tourne pendant l&#8217;inactivit\u00e9 de Claude Code pour nettoyer la m\u00e9moire. Il vire les doublons, r\u00e9sout les contradictions, v\u00e9rifie que les fichiers existent encore. Et m\u00eame s&#8217;il ne le r\u00e9clame pas parce qu&#8217;ils n&#8217;ont pas de bouche pour vous parler, vos CLAUDE.md de 200 lignes et vos JSON de 70 Ko ont besoin du m\u00eame traitement ! Donc il faut que vous ajoutiez une phase genre &#8220;dream&#8221; en bash ou Node.js \u00e0 la fin de vos workflows, comme \u00e7a, plut\u00f4t que de tout garder,<\/p>\n","protected":false},"author":1,"featured_media":2660,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"give_campaign_id":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-2659","page","type-page","status-publish","has-post-thumbnail","hentry"],"campaignId":"","_links":{"self":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2659","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/comments?post=2659"}],"version-history":[{"count":0,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2659\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media\/2660"}],"wp:attachment":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media?parent=2659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}