Imaginez refactoriser votre code en un clin d’œil sans gaspiller des tokens sur votre LLM préféré. Imaginez encore modifier le thème de votre site web en un rien de temps grâce à l’IA et les bons outils. À défaut, imaginez remplacer grep ou ripgrep par un outil encore plus magique. Et bien, c’est peut être ast-grep qu’il vous faut !
ast-grep est un programme pour développeurs disponible sur de nombreuses plateformes. Toujours dans la catégorie IA, cette fois je vous fais découvrir un outil très agréable pour ceux qui utilisent Claude Code, Qwen Code, Opencode ou encore Crush. ast-grep permet de faire de la recherche et du remplacement de masse, et donc d’économiser des tokens sur votre LLM.
Qu’est-ce qu’ast-grep ?
ast-grep est un outil de recherche et de transformation de code basé sur l’analyse syntaxique (Abstract Syntax Tree). Contrairement aux outils de recherche textuelle traditionnels comme grep
, le programme comprend la structure du code, permettant des recherches précises et contextuelles dans votre codebase. C’est un peu un grep boosté aux épinards de Popeye qui remplace ce que vous voulez où vous le voulez – dans la limite du raisonnable, quand même.
Comment installer ast-grep ?

Installer ast-grep est simple et rapide, selon votre système d’exploitation et vos préférences. L’outil est principalement distribué via Cargo (le gestionnaire de paquets de Rust), mais des alternatives existent pour éviter d’installer Rust si vous n’en avez pas besoin. Voici les méthodes principales. Assurez-vous d’avoir une connexion internet active.
Prérequis
Avant de commencer, vérifiez que vous avez :
- Un terminal comme cmd (beurk 😬) ou Powershell sur Windows, Terminal sur macOS, ou Bash sur Linux.
- Pour la méthode Cargo : Rust installé (téléchargez-le depuis rustup.rs si nécessaire).
- Permissions d’administration si besoin pour les installations globales.
1. Installation via Cargo (recommandée pour les utilisateurs Rust)
Cette méthode est la plus directe si vous avez déjà Rust installé. Ouvrez votre terminal et exécutez :
cargo install ast-grep
Une fois terminé, vérifiez l’installation en tapant ast-grep --version
. Cela devrait afficher la version installée (ex. 0.20.0 ou supérieure). Si Cargo n’est pas dans votre PATH, redémarrez votre terminal.
2. Installation via npm (pour les utilisateurs Node.js)
Si vous préférez éviter Rust, utilisez la version JavaScript via npm. Assurez-vous d’avoir Node.js installé (version 14+ recommandée).
npm install -g @ast-grep/cli
Ensuite, lancez sg --version
(l’exécutable s’appelle sg
dans cette version). Notez que cette variante pourrait être légèrement moins performante que la version Rust pour les grands codebases.
3. Installation via pip (pour les utilisateurs Python)
Une autre alternative sans Rust : utilisez Python (version 3.8+). Installez via pip :
pip install ast-grep
Exécutez ensuite ast-grep --version
pour vérifier. Cette méthode est idéale pour les environnements sans compilation.
4. Autres méthodes et gestionnaires de paquets
- Homebrew (macOS/Linux) :
brew install ast-grep
- Scoop (Windows) :
scoop install ast-grep
- Docker : Pour un conteneur isolé, utilisez l’image officielle :
docker run --rm -v $(pwd):/src ast-grep/ast-grep scan /src
.
Consultez la documentation officielle pour les mises à jour ou les problèmes spécifiques à votre OS. Si vous rencontrez des erreurs (ex. permissions), essayez avec sudo
(Linux/macOS) ou en tant qu’administrateur (Windows). Si besoin, laissez un petit commentaire au bas de cet article.
Pourquoi utiliser cet outil ?
En premier lieu, pour les férus du langage, ast-grep est codé en Rust, oui oui, le même Rust qui fait peut-être tourner votre navigateur actuellement et dont de nombreux développeurs font l’éloge. Maintenant que c’est dit, il n’y a pas que ça.
Il supporte plusieurs langages, que l’on peut définir en argument lors du lancement du programme. Le site officiel indique les langages suivants :
Domaine de langage | Langages supportés |
Programmation système | C , C++ , Rust |
Programmation serveur | Go , Java , Python , C# |
Web développement | JS(X) , TS(X) , HTML , CSS |
Mobile | Kotlin , Swift |
Configuration | JSON , YAML |
Scripting et protocoles | Lua , Thrift |
Parmi les avantages face aux outils classiques comme tree, grep ou encore ripgrep, il y a :
- Recherche structurelle intelligente : Au lieu de chercher des chaînes de caractères, ast-grep recherche des patterns syntaxiques. Vous pouvez trouver toutes les fonctions qui prennent un paramètre spécifique, peu importe leur nom ou leur position dans le code.
- Support multi-langage : JavaScript, TypeScript, Python, Rust, Go, Java, et bien d’autres langages sont supportés nativement. Si vous êtes sur Windows et que vous n’avez pas Cargo installé, vous pouvez par exemple utiliser la version Python ou JavaScript.
- Transformations sûres : Les modifications se basent sur la structure du code, réduisant drastiquement les risques d’erreurs lors des refactorings.
Ce qu’on peut faire avec ast-grep

Pour vous prouver la puissance d’ast-grep, rien ne vaut quelques lignes d’exemples.
1. Identifier des fonctions dans le code source
# Trouver toutes les fonctions nommées 'handle'
ast-grep --pattern 'function handle($$$) { $$$ }' --lang js
2. Extraction de contexte précis
Avant de poser une question à Claude Code, utilisez ast-grep pour extraire le contexte pertinent :
# Trouver tous les hooks React personnalisés
ast-grep --pattern 'function use$HOOK_NAME() { $$$ }' --lang tsx
# Extraire toutes les définitions de types TypeScript
ast-grep --pattern 'type $NAME = $$$' --lang typescript
3. Analyse de patterns problématiques
Identifiez rapidement les anti-patterns ou les zones de code problématiques :
# Détecter les fonctions async sans gestion d'erreur explicite
ast-grep --pattern 'async function $NAME($$$) { $$$ }' --globs '!**/*test*'
# Trouver les console.log oubliés en production
ast-grep --pattern 'console.log($$$)' --globs '!node_modules/*' # Identifier les variables déclarées mais non utilisées ast-grep --pattern 'let $VAR = $$$'
Pour des patterns plus complexes, il est possible non pas de faire appel aux arguments en ligne de commande, mais carrément de créer un fichier YAML qui fera les détections ou changements nécessaires. C’est plus complexe et plus long, mais aussi plus précis. Voici ce que ça donne :
# rules/no-async-without-try-catch.yml
id: async-without-error-handling
language: JavaScript
rule:
all:
- pattern: |
async function $NAME($$$) {
$$$BODY
}
- not:
pattern: |
async function $NAME($$$) {
try {
$$$
} catch ($$$) {
$$$
}
}
Pour exécuter cette règle :
ast-grep scan --rule rules/no-async-without-try-catch.yml
4. Préparation de refactorings complexes
Avant de faire un refactoring majeur, il est possible de prévisualiser des changements :
# Identifier toutes les utilisations d'une ancienne API
ast-grep --pattern 'oldAPI.$METHOD($$$)' # Localiser tous les imports d'un module spécifique ast-grep --pattern 'import { $$$ } from "old-library"'
# Exclure les fichiers de test et de documentation
ast-grep --pattern 'deprecatedFunction($$$)' --globs '!**/*test*' --globs '!**/docs/*'
5. Identifier des requêtes vulnérables en SQL :
# Détecter les requêtes SQL potentiellement vulnérables
ast-grep --pattern 'query("SELECT * FROM " + $VAR)'
# Trouver les utilisations dangereuses d'eval ast-grep --pattern 'eval($CODE)'
# Identifier les expressions régulières complexes sans validation
ast-grep --pattern 'new RegExp($PATTERN)'
6. Trouver des boucles imbriquées :
# Trouver les boucles imbriquées
ast-grep --pattern 'for ($$$) { $$$ for ($$$) { $$$ } $$$ }' # Détecter les appels synchrones bloquants dans du code async ast-grep --pattern 'fs.readFileSync($$$)'
# Identifier les re-rendus React potentiellement coûteux ast-grep --pattern 'useEffect(() => { $$$ }, [])' --lang tsx
7. Intégrer ast-grep dans un workflow avec Claude Code (ou autre) :
Pour les utilisateurs de CI/CD, que ce soit avec GitHub, GitLab, Gitea ou une autre plateforme, vous pouvez créer un script qui va parcourir votre code pour retrouver des patterns interdits. Un exemple ici avec un script Bash :
#!/bin/bash
# Vérifier l'absence d'anti-patterns avant le merge
if ast-grep --pattern 'console.log($$$)' --globs '!**/*test*' --quiet; then
echo "Console.log détecté - demander à Claude Code de les remplacer par un logger approprié"
exit 1
fi
# Vérifier l'absence de TODO en production
if ast-grep --pattern 'TODO: $$$' --quiet; then
echo "TODO trouvés - review nécessaire"
exit 1
fi