TL;DR
Convertissez un fichier d'agent IA en 10 IDE en 3 étapes : (1) Analysez le frontmatter YAML avec les fonctions bash get_field(), get_body() et to_kebab(), (2) Transformez vers des formats spécifiques aux outils en utilisant convert.sh (Claude Code .md, Cursor .mdc, Aider CONVENTIONS.md, Windsurf .windsurfrules), (3) Installez vers les chemins corrects avec install.sh. Écrivez une fois, convertissez automatiquement, déployez partout.
Un fichier d'agent. Dix IDE. Apprenez comment le projet The Agency convertit un seul fichier Markdown pour fonctionner avec Claude Code, Cursor, Aider, Windsurf, GitHub Copilot et plus de 6 autres outils.
Vous écrivez un agent IA. Maintenant, vous voulez qu'il soit disponible dans :
- Claude Code (fichiers
.mddans~/.claude/agents/) - Cursor (fichiers
.mdcdans.cursor/rules/) - Aider (un seul
CONVENTIONS.mdà la racine du projet) - Windsurf (un seul fichier
.windsurfrules) - GitHub Copilot (fichiers
.mddans~/.github/agents/) - Et 5+ autres outils
Écrivez-vous 10 versions ? Non. Vous écrivez une fois, convertissez automatiquement.
Le projet The Agency résout ce problème avec deux scripts bash :
convert.sh— Transforme les fichiers d'agent en formats spécifiques aux outilsinstall.sh— Copie les fichiers convertis vers les chemins corrects
Dans ce tutoriel, vous ferez de la rétro-ingénierie des deux scripts. Vous apprendrez à analyser le frontmatter YAML, à extraire le contenu du corps et à construire des pipelines de conversion pour n'importe quel outil.
Le format d'agent
Chaque agent de The Agency utilise la même structure :
---
name: API Tester
description: Specialized in API testing with Apidog, Postman, and automated validation
color: purple
emoji: 🧪
vibe: Breaks APIs before users do.
---
# API Tester Agent Personality
You are **API Tester**, an expert in API validation...
## Identity & Memory
- Role: API testing specialist
- Personality: Thorough, skeptical, evidence-focused
...
Le fichier a deux parties :
- Frontmatter — Métadonnées YAML entre des délimiteurs
--- - Corps — Contenu Markdown après le second
---
La conversion signifie : extraire les champs du frontmatter, transformer le corps au format cible, écrire vers le chemin correct.
Étape 1 : Analyser le frontmatter YAML
Créez parse-frontmatter.sh :
#!/usr/bin/env bash
#
# parse-frontmatter.sh — Extract YAML frontmatter fields from agent files
#
set -euo pipefail
# Extract a single field value from YAML frontmatter
# Usage: get_field <field> <file>
get_field() {
local field="$1" file="$2"
awk -v f="$field" '
/^---$/ { fm++; next }
fm == 1 && $0 ~ "^" f ": " {
sub("^" f ": ", "");
print;
exit
}
' "$file"
}
# Strip frontmatter, return only body
# Usage: get_body <file>
get_body() {
awk 'BEGIN{fm=0} /^---$/{fm++; next} fm>=2{print}' "$1"
}
# Convert name to kebab-case slug
# Usage: to_kebab "API Tester" → api-tester
to_kebab() {
echo "$1" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g'
}
# Demo
if [[ "${1:-}" == "--demo" ]]; then
AGENT_FILE="${2:-test-agent.md}"
echo "File: $AGENT_FILE"
echo "Name: $(get_field 'name' "$AGENT_FILE")"
echo "Description: $(get_field 'description' "$AGENT_FILE")"
echo "Slug: $(to_kebab "$(get_field 'name' "$AGENT_FILE")")"
echo "---"
echo "Body preview:"
get_body "$AGENT_FILE" | head -10
fi
Testez-le :
chmod +x parse-frontmatter.sh
./parse-frontmatter.sh --demo engineering-backend-architect.md
Sortie :
File: engineering-backend-architect.md
Name: Backend Architect
Description: Senior backend architect specializing in scalable system design...
Slug: backend-architect
---
Body preview:
# Backend Architect Agent Personality
You are **Backend Architect**, a senior backend architect...
Étape 2 : Convertir au format Claude Code
Claude Code utilise des fichiers .md bruts. Aucune conversion nécessaire — il suffit de copier :
convert_claude_code() {
local agent_file="$1"
local dest="$HOME/.claude/agents/"
mkdir -p "$dest"
cp "$agent_file" "$dest/"
echo " Claude Code: $(basename "$agent_file")"
}
Étape 3 : Convertir au format Cursor
Cursor utilise des fichiers .mdc avec un champ description dans le frontmatter :
convert_cursor() {
local agent_file="$1"
local name=$(get_field 'name' "$agent_file")
local description=$(get_field 'description' "$agent_file")
local slug=$(to_kebab "$name")
local body=$(get_body "$agent_file")
local output=".cursor/rules/agency-${slug}.mdc"
mkdir -p "$(dirname "$output")"
cat > "$output" << EOF
---
description: Agency agent: $description
---
$body
EOF
echo " Cursor: agency-${slug}.mdc"
}
Entrée :
---
name: API Tester
description: Specialized in API testing...
---
# API Tester Agent...
Sortie (.mdc) :
---
description: Agency agent: Specialized in API testing...
---
# API Tester Agent...
Étape 4 : Convertir au format Aider
Aider utilise un seul fichier CONVENTIONS.md contenant tous les agents :
convert_aider() {
local agent_file="$1"
local output="CONVENTIONS.md"
# Append with separator
echo "" >> "$output"
echo "---" >> "$output"
echo "" >> "$output"
cat "$agent_file" >> "$output"
echo " Aider: appended to $output"
}
Construire le fichier complet :
build_aider() {
local output="CONVENTIONS.md"
echo "# Agency Agents for Aider" > "$output"
echo "" >> "$output"
echo "This file contains all Agency agents for Aider integration." >> "$output"
echo "" >> "$output"
for agent_file in engineering/*.md design/*.md testing/*.md; do
convert_aider "$agent_file"
done
}
Étape 5 : Convertir au format Windsurf
Windsurf utilise un seul fichier .windsurfrules (similaire à Aider) :
convert_windsurf() {
local agent_file="$1"
local output=".windsurfrules"
echo "" >> "$output"
echo "---" >> "$output"
echo "" >> "$output"
cat "$agent_file" >> "$output"
echo " Windsurf: appended to $output"
}
Étape 6 : Convertir au format Antigravity
Antigravity (Gemini) utilise des fichiers SKILL.md dans des sous-répertoires :
convert_antigravity() {
local agent_file="$1"
local name=$(get_field 'name' "$agent_file")
local slug=$(to_kebab "$name")
local output="integrations/antigravity/skills/agency-${slug}/SKILL.md"
mkdir -p "$(dirname "$output")"
cat > "$output" << EOF
# Agency Agent: $name
$(get_body "$agent_file")
EOF
echo " Antigravity: agency-${slug}/SKILL.md"
}
Étape 7 : Convertir au format OpenClaw
OpenClaw utilise trois fichiers par agent (SOUL.md, AGENTS.md, IDENTITY.md) :
convert_openclaw() {
local agent_file="$1"
local name=$(get_field 'name' "$agent_file")
local description=$(get_field 'description' "$agent_file")
local slug=$(to_kebab "$name")
local body=$(get_body "$agent_file")
local output_dir="integrations/openclaw/agency-${slug}"
mkdir -p "$output_dir"
# SOUL.md - Main agent definition
cat > "$output_dir/SOUL.md" << EOF
# $name
$description
---
$body
EOF
# AGENTS.md - Agent capabilities
cat > "$output_dir/AGENTS.md" << EOF
# Agent Capabilities: $name
- Specialized expertise in domain
- Deliverable-focused output
- Success metrics defined
See SOUL.md for full definition.
EOF
# IDENTITY.md - Agent identity
cat > "$output_dir/IDENTITY.md" << EOF
# Identity: $name
- Name: $name
- Description: $description
- Source: The Agency (agency-agents repo)
EOF
echo " OpenClaw: agency-${slug}/"
}
Étape 8 : Le script convert.sh complet
Voici le script de conversion complet (simplifié) :
#!/usr/bin/env bash
#
# convert.sh — Convert all Agency agents to tool-specific formats
#
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
OUT_DIR="$REPO_ROOT/integrations"
# Frontmatter helpers
get_field() {
local field="$1" file="$2"
awk -v f="$field" '
/^---$/ { fm++; next }
fm == 1 && $0 ~ "^" f ": " { sub("^" f ": ", ""); print; exit }
' "$file"
}
get_body() {
awk 'BEGIN{fm=0} /^---$/{fm++; next} fm>=2{print}' "$1"
}
to_kebab() {
echo "$1" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g'
}
# Conversion functions
convert_claude_code() {
local agent_file="$1"
local dest="$OUT_DIR/claude-code/"
mkdir -p "$dest"
cp "$agent_file" "$dest/"
}
convert_cursor() {
local agent_file="$1"
local name=$(get_field 'name' "$agent_file")
local slug=$(to_kebab "$name")
local body=$(get_body "$agent_file")
mkdir -p "$OUT_DIR/cursor/.cursor/rules/"
cat > "$OUT_DIR/cursor/.cursor/rules/agency-${slug}.mdc" << EOF
---
description: Agency agent: $(get_field 'description' "$agent_file")
---
$body
EOF
}
convert_aider() {
local output="$OUT_DIR/aider/CONVENTIONS.md"
echo "" >> "$output"
echo "---" >> "$output"
cat "$agent_file" >> "$output"
}
convert_windsurf() {
local output="$OUT_DIR/windsurf/.windsurfrules"
echo "" >> "$output"
echo "---" >> "$output"
cat "$agent_file" >> "$output"
}
# Main conversion loop
echo "Converting Agency agents..."
AGENT_DIRS=(engineering design testing marketing sales)
for dir in "${AGENT_DIRS[@]}"; do
for agent_file in "$REPO_ROOT/$dir"/*.md; do
[[ -f "$agent_file" ]] || continue
name=$(get_field 'name' "$agent_file")
echo "Processing: $name"
convert_claude_code "$agent_file"
convert_cursor "$agent_file"
done
done
# Build combined files
echo "# Agency Agents for Aider" > "$OUT_DIR/aider/CONVENTIONS.md"
for dir in "${AGENT_DIRS[@]}"; do
for agent_file in "$REPO_ROOT/$dir"/*.md; do
[[ -f "$agent_file" ]] || continue
convert_aider "$agent_file"
done
done
echo "# Agency Agents for Windsurf" > "$OUT_DIR/windsurf/.windsurfrules"
for dir in "${AGENT_DIRS[@]}"; do
for agent_file in "$REPO_ROOT/$dir"/*.md; do
[[ -f "$agent_file" ]] || continue
convert_windsurf "$agent_file"
done
done
echo "Conversion complete!"
echo " Claude Code: $OUT_DIR/claude-code/"
echo " Cursor: $OUT_DIR/cursor/.cursor/rules/"
echo " Aider: $OUT_DIR/aider/CONVENTIONS.md"
echo " Windsurf: $OUT_DIR/windsurf/.windsurfrules"
Exécutez-le :
chmod +x convert.sh
./convert.sh
Étape 9 : Installer vers chaque outil
Après la conversion, copiez les fichiers vers les chemins spécifiques aux outils :
#!/usr/bin/env bash
#
# install.sh — Install converted agents to your local tools
#
set -euo pipefail
# Claude Code
install_claude_code() {
local src="$REPO_ROOT/integrations/claude-code/"
local dest="$HOME/.claude/agents/"
mkdir -p "$dest"
cp "$src"/*.md "$dest/"
echo "Claude Code: $(find "$dest" -name '*.md' | wc -l) agents installed"
}
# Cursor
install_cursor() {
local src="$REPO_ROOT/integrations/cursor/.cursor/rules/"
local dest="./.cursor/rules/"
mkdir -p "$dest"
cp "$src"/*.mdc "$dest/"
echo "Cursor: $(find "$dest" -name '*.mdc' | wc -l) rules installed"
}
# Aider
install_aider() {
local src="$REPO_ROOT/integrations/aider/CONVENTIONS.md"
local dest="./CONVENTIONS.md"
cp "$src" "$dest"
echo "Aider: CONVENTIONS.md installed"
}
# Windsurf
install_windsurf() {
local src="$REPO_ROOT/integrations/windsurf/.windsurfrules"
local dest="./.windsurfrules"
cp "$src" "$dest"
echo "Windsurf: .windsurfrules installed"
}
# Install all detected tools
install_all() {
if [[ -d "$HOME/.claude/agents/" ]]; then
install_claude_code
fi
if command -v cursor &>/dev/null || [[ -d "./.cursor/" ]]; then
install_cursor
fi
if command -v aider &>/dev/null; then
install_aider
fi
}
install_all
Comparaison des formats
| Outil | Format | Portée | Conversion |
|---|---|---|---|
| Claude Code | .md |
Utilisateur (~/.claude/agents/) |
Copie telle quelle |
| Cursor | .mdc |
Projet (.cursor/rules/) |
Ajouter la description du frontmatter |
| Aider | CONVENTIONS.md |
Racine du projet | Concaténer tous les agents |
| Windsurf | .windsurfrules |
Racine du projet | Concaténer tous les agents |
| GitHub Copilot | .md |
Utilisateur (~/.github/agents/) |
Copie telle quelle |
| Antigravity | SKILL.md |
Utilisateur (~/.gemini/antigravity/) |
Encapsuler dans un répertoire de compétences |
| OpenClaw | SOUL.md + autres |
Utilisateur (~/.openclaw/) |
Diviser en 3 fichiers |
| Gemini CLI | Extension | Utilisateur (~/.gemini/extensions/) |
Générer le manifeste + les compétences |
| OpenCode | .md |
Projet (.opencode/agents/) |
Copie telle quelle |
| Qwen Code | .md |
Projet (.qwen/agents/) |
Copier en tant que sous-agent |
Créez votre propre script de conversion
Modèle pour ajouter un nouvel outil :
#!/usr/bin/env bash
# 1. Define conversion function
convert_your_tool() {
local agent_file="$1"
local name=$(get_field 'name' "$agent_file")
local description=$(get_field 'description' "$agent_file")
local slug=$(to_kebab "$name")
local body=$(get_body "$agent_file")
# 2. Create output path
local output="path/to/your/tool/agency-${slug}.ext"
mkdir -p "$(dirname "$output")"
# 3. Write converted content
cat > "$output" << EOF
# Your tool-specific format
# Use: $name, $description, $body
EOF
echo " YourTool: agency-${slug}.ext"
}
# 4. Add to main loop
for agent_file in engineering/*.md; do
convert_your_tool "$agent_file"
done
Ce que vous avez construit
| Composant | Objectif |
|---|---|
get_field() |
Extraire les valeurs du frontmatter YAML |
get_body() |
Supprimer le frontmatter, retourner le corps markdown |
to_kebab() |
Convertir les noms en slugs URL-compatibles |
convert_cursor() |
Transformer au format .mdc |
convert_aider() |
Concaténer en un seul fichier |
convert_windsurf() |
Concaténer en un seul fichier |
convert_antigravity() |
Créer des répertoires de compétences |
convert_openclaw() |
Diviser en 3 fichiers par agent |
install.sh |
Copier vers les chemins spécifiques aux outils |
Prochaines étapes
Étendez les scripts :
- Ajoutez la conversion parallèle avec
xargs -Pou GNU parallel - Ajoutez la validation (vérifiez les champs de frontmatter requis)
- Ajoutez un mode d'exécution à blanc (option
--dry-run)
Ajoutez plus d'outils :
- Extensions VS Code
- IDE JetBrains
- Outils internes personnalisés
Optimisez pour les grands dépôts :
- Mettez en cache le frontmatter analysé
- Utilisez
findavec-print0pour une gestion sûre des fichiers - Ajoutez des barres de progression pour plus de 100 agents
Dépannage des problèmes courants
Le script de conversion échoue avec "mauvaise substitution" :
- Assurez-vous d'exécuter bash, pas sh :
#!/usr/bin/env bash - Vérifiez la version de bash :
bash --version(doit être 4.0+) - Exécutez explicitement avec bash :
bash convert.sh - Recherchez les fins de ligne Windows :
sed -i 's/\r$//' convert.sh
Les champs du frontmatter ne sont pas extraits :
- Vérifiez que le format YAML utilise
:(deux points espace) et non seulement: - Vérifiez l'absence d'espaces supplémentaires avant les noms de champs
- Assurez-vous que les délimiteurs de frontmatter sont exactement
---(3 tirets) - Testez l'analyse manuellement :
./parse-frontmatter.sh --demo agent.md
La génération de slugs crée des noms corrompus :
- Testez la fonction
to_kebab()avec des cas limites - Gérez les caractères spéciaux :
to_kebab() { echo "$1" | iconv -f utf8 -t ascii//translit | ... } - Ajoutez une solution de secours pour les slugs vides :
[[ -z "$slug" ]] && slug="unknown-agent" - Consignez les noms originaux pour le débogage
Les règles Cursor ne se chargent pas :
- Vérifiez que les fichiers
.mdcont un frontmatter valide avecdescription - Vérifiez la configuration MCP de Cursor :
.cursor/mcp.json - Assurez-vous que les fichiers sont dans
.cursor/rules/et non dans.cursor/agents/ - Redémarrez Cursor après avoir ajouté de nouvelles règles
Le fichier Aider CONVENTIONS.md devient trop volumineux :
- Divisez par catégorie :
CONVENTIONS-engineering.md,CONVENTIONS-design.md - Implémentez une suppression automatique des agents obsolètes
- Ajoutez une table des matières en haut
- Envisagez des fichiers par agent avec des directives d'inclusion
Optimisation des performances pour les conversions importantes
Traitement parallèle :
Pour les dépôts avec plus de 100 agents, utilisez GNU parallel :
#!/usr/bin/env bash
# convert-parallel.sh
export OUT_DIR="$REPO_ROOT/integrations"
# Export functions for parallel use
export -f get_field get_body to_kebab convert_cursor convert_claude_code
# Find all agent files and process in parallel
find "$REPO_ROOT" -name "*.md" -type f | \
parallel -j 8 --progress '
name=$(get_field "name" {})
slug=$(to_kebab "$name")
echo "Converting: $name"
convert_cursor "{}"
convert_claude_code "{}"
'
echo "Parallel conversion complete!"
Conversion incrémentielle :
Ne convertissez que les fichiers modifiés :
#!/usr/bin/env bash
# convert-incremental.sh
CACHE_FILE="$REPO_ROOT/.conversion-cache"
# Load previous state
declare -A PREV_HASHES
if [[ -f "$CACHE_FILE" ]]; then
while IFS='=' read -r file hash; do
PREV_HASHES["$file"]="$hash"
done < "$CACHE_FILE"
fi
# Process each agent
for agent_file in engineering/*.md; do
CURRENT_HASH=$(md5sum "$agent_file" | cut -d' ' -f1)
PREV_HASH="${PREV_HASHES[$agent_file]:-}"
if [[ "$CURRENT_HASH" != "$PREV_HASH" ]]; then
echo "Changed: $agent_file"
convert_cursor "$agent_file"
convert_claude_code "$agent_file"
NEW_HASHES["$agent_file"]="$CURRENT_HASH"
else
echo "Unchanged: $agent_file"
fi
done
# Save cache
for file in "${!NEW_HASHES[@]}"; do
echo "$file=${NEW_HASHES[$file]}"
done > "$CACHE_FILE"
Suivi de la progression :
Ajoutez une progression visuelle pour les longues conversions :
#!/usr/bin/env bash
total_files=$(find "$REPO_ROOT" -name "*.md" -type f | wc -l)
current=0
for agent_file in "$REPO_ROOT"/**/*.md; do
((current++))
percent=$((current * 100 / total_files))
# Progress bar
filled=$((percent / 5))
empty=$((20 - filled))
bar=$(printf '%*s' "$filled" | tr ' ' '#')
spaces=$(printf '%*s' "$empty" | tr ' ' ' ')
name=$(get_field 'name' "$agent_file")
echo -ne "\r[${bar}${spaces}] ${percent}% - $name"
convert_cursor "$agent_file"
done
echo -ne "\n"
Considérations de sécurité pour les agents partagés
Validation des sources d'agents :
Lors du téléchargement d'agents depuis des sources externes :
#!/usr/bin/env bash
# validate-agent.sh
validate_agent() {
local file="$1"
# Check required frontmatter fields
local name=$(get_field 'name' "$file")
local description=$(get_field 'description' "$file")
if [[ -z "$name" ]]; then
echo "ERROR: Missing 'name' field in $file"
return 1
fi
if [[ -z "$description" ]]; then
echo "WARNING: Missing 'description' field in $file"
fi
# Check for malicious patterns in body
local body=$(get_body "$file")
if echo "$body" | grep -q 'rm -rf\|curl.*\|wget.*\|eval\|exec'; then
echo "WARNING: Potentially dangerous patterns in $file"
return 1
fi
echo "VALID: $name"
return 0
}
Exécution d'agents en sandbox :
Pour les agents non fiables, exécutez dans des environnements isolés :
- Utilisez des conteneurs Docker pour l'exécution des agents
- Limitez l'accès au système de fichiers avec des montages en lecture seule
- Restreignez l'accès réseau à des domaines spécifiques
- Enregistrez toutes les actions des agents pour les pistes d'audit
Un fichier d'agent. Dix IDE. Deux scripts bash.
C'est le pouvoir de l'automatisation de la conversion. Écrivez une fois, convertissez automatiquement, installez partout.
À votre tour : ajoutez la prise en charge de la conversion pour votre outil IA préféré. Partagez le script. Rendez les agents portables.
Points clés à retenir
- Écrivez une fois, convertissez vers plus de 10 formats — Un seul fichier Markdown avec frontmatter YAML se transforme pour Claude Code, Cursor, Aider, Windsurf et plus de 6 autres outils
- L'analyse bash gère l'extraction du frontmatter —
get_field()extrait les valeurs YAML,get_body()supprime le frontmatter,to_kebab()crée des slugs URL-compatibles - Les formats spécifiques aux outils nécessitent des transformations différentes — Claude Code copie tel quel, Cursor ajoute la description du frontmatter, Aider/Windsurf concatènent tous les agents
- Les scripts d'installation copient vers les chemins corrects — Les outils utilisateur utilisent
~/.claude/agents/, les outils de projet utilisent.cursor/rules/ou les fichiers à la racine du projet - Étendez avec des modèles pour de nouveaux outils — Définissez la fonction
convert_your_tool(), ajoutez-la à la boucle principale, documentez les exigences de format
FAQ
Qu'est-ce que convert.sh et comment ça marche ? convert.sh est un script bash qui analyse le frontmatter YAML des fichiers Markdown d'agent, extrait le contenu du corps et transforme chaque agent en formats spécifiques aux outils. Il utilise awk pour l'analyse, sed pour la conversion de slugs et les heredocs pour la génération de sortie.
Comment fonctionne l'analyse du frontmatter en bash ? La fonction get_field() utilise awk pour suivre les délimiteurs du frontmatter (---), trouve la ligne correspondant au nom du champ et en extrait la valeur. get_body() affiche toutes les lignes après le second délimiteur ---.
Quels IDE et outils sont pris en charge ? Claude Code (.md), Cursor (.mdc), Aider (CONVENTIONS.md), Windsurf (.windsurfrules), GitHub Copilot (.md), Antigravity (SKILL.md), OpenClaw (SOUL.md + 2 fichiers), extensions Gemini CLI, OpenCode et Qwen Code.
Comment puis-je ajouter la prise en charge de la conversion pour un nouvel outil ? Créez une fonction convert_yourtool() qui extrait les champs du frontmatter, transforme le corps au format de votre outil et écrit vers le chemin correct. Ajoutez l'appel de la fonction à la boucle de conversion principale.
Puis-je exécuter des conversions en parallèle pour un traitement plus rapide ? Oui. Utilisez xargs -P ou GNU parallel pour traiter plusieurs fichiers d'agent simultanément. Pour plus de 100 agents, la conversion parallèle peut réduire le temps d'exécution de minutes à secondes.
Comment puis-je valider l'existence des champs du frontmatter ? Ajoutez des vérifications de validation dans votre fonction de conversion : [[ -z "$name" ]] && echo "Missing name field" && exit 1. Exécutez la validation avant d'écrire les fichiers de sortie.
Que se passe-t-il si la conversion échoue pour certains agents ? Utilisez set -euo pipefail pour échouer rapidement en cas d'erreurs. Ajoutez une gestion des erreurs avec || continue pour ignorer les fichiers corrompus. Enregistrez les échecs dans un fichier séparé pour le débogage.
