Barad-Dur
L'œil qui voit tout dans vos dépôts Git
Nommé d'après la Tour Sombre du Mordor, Barad-Dur est un outil CLI écrit en Rust qui analyse la santé de vos dépôts Git en profondeur. Il ne se contente pas de mesurer la qualité du code : il évalue aussi la dynamique d'équipe, la dette temporelle, et la robustesse organisationnelle.
Ce que Barad-Dur analyse
L'outil génère un score global sur 100 à partir de cinq dimensions pondérées, chacune décomposée en métriques concrètes et actionnables.
Health
- Bus factor — concentration du savoir sur 1-2 personnes
- Hotspots — fichiers à fort turnover et haute complexité
- Couplage temporel — fichiers qui changent toujours ensemble sans lien apparent
- Code stagnant — fichiers non touchés depuis longtemps
Evolution
- Ratio de refactoring — part des commits qui restructurent vs. ajoutent
- Cadence de commits — vélocité et régularité du développement
- Âge du code — ancienneté médiane des fichiers
- Tendance de croissance — évolution nette du volume de code
Dependencies
- Libyear drift — retard cumulé de vos dépendances en années
- Détection CVE — vulnérabilités via l'API OSV
- Supports : Cargo, npm, pip, NuGet
- Activé via
--deps
Git Hygiene
- Qualité des messages — commits conventionnels, messages vides
- Propreté de l'historique — merges octopus, squash ratio
- Couverture .gitignore — fichiers suspects trackés
Team
- Coefficient de Gini — inégalité de distribution de la connaissance
- Silos de répertoires — auteurs isolés sur des zones du code
- Ownership — fichiers sans responsable clair
- Activité des contributeurs — qui est encore actif
Installation et utilisation
Installer
cargo install barad-dur Ou via Docker :
docker run --rm -v /repo:/repo \
ghcr.io/edouard-mangel/barad-dur \
analyze . Analyser
# Repo local
barad-dur analyze .
# Repo distant (clone auto)
barad-dur analyze https://github.com/user/repo
# Rapport HTML autonome
barad-dur analyze . --html -o rapport.html
# Gate CI/CD (exit 1 si score < 70)
barad-dur gate . --min-score 70 Intégration CI/CD
Barad-Dur est disponible en tant que composant du GitLab CI Catalog. Une seule ligne suffit pour ajouter l'analyse à votre pipeline, sans gérer l'installation ni le téléchargement du binaire.
Inclusion minimale
include:
- component: lab.frogg.it/Edouard_Mangel/barad-dur/analyze@~latest
Cela ajoute un job barad-dur-analyze dans le stage test,
qui s'exécute sur la branche par défaut et sur chaque merge request.
Il produit deux artefacts accessibles depuis l'interface GitLab :
barad-dur-report.json et barad-dur-report.html.
Avec quality gate et options
include:
- component: lab.frogg.it/Edouard_Mangel/barad-dur/analyze@~latest
inputs:
min_score: 70 # échec du pipeline si score < 70
version: "v0.12.0" # optionnel : fixer une version précise
flags: "--skip-blame" # optionnel : flags supplémentaires
Avec min_score, le job retourne un exit code non-nul si le score
global est inférieur au seuil — ce qui fait échouer le pipeline et bloque le merge.
Idéal pour maintenir un niveau de santé minimum sur la durée.
Ce que le pipeline produit
Rapport interactif autonome, accessible depuis l'onglet "Artifacts" de GitLab. Aucune dépendance externe.
Données brutes structurées. Exploitables par d'autres jobs, des dashboards Grafana, ou des scripts de monitoring.
Exit code non-nul si score < seuil. S'intègre naturellement dans les règles de protection de branche GitLab.
GIT_DEPTH: "0" pour cloner l'historique complet —
nécessaire pour que les métriques de churn et de blame soient représentatives.
Sur un repo avec un historique long, pensez à utiliser --skip-blame
pour accélérer l'analyse au prix des métriques d'ownership.
Analyses réelles
Deux exemples avec des données collectées le 15 avril 2026 — un projet solo en développement actif, et un projet open-source mature avec plusieurs contributeurs.
barad-dur Projet solo, en développement actif
Actions recommandées
- [Health] Bus factor (score : 20) — Augmenter la revue de code pour diffuser la connaissance
- [Health] Couplage temporel (score : 25) — Découpler src/cli.rs et src/main.rs (85% de co-changements)
- [Team] Silos de répertoires (score : 25) — 29 silos détectés — révisions croisées recommandées
Hotspots (churn × complexité)
| Fichier | Churn | Complexité | LOC |
|---|---|---|---|
.gitlab-ci.yml | 40 | 33 | 447 |
src/main.rs | 46 | 1 | 24 |
src/renderer/html.rs | 39 | 3 | 60 |
src/scorer.rs | 31 | 4 | 403 |
Couplage temporel
| Fichier A | Fichier B | Co-changements |
|---|---|---|
src/cli.rs | src/main.rs | 85% |
Cargo.lock | Cargo.toml | 89% |
src/renderer/cli.rs | src/renderer/json.rs | 71% |
Le couplage src/cli.rs / src/main.rs à 85% révèle
que l'interface CLI et le point d'entrée évoluent toujours ensemble —
signal d'une abstraction à extraire.
BurntSushi/ripgrep Projet mature, fenêtre 6 mois — faible activité attendue
Actions recommandées
- [Health] Bus factor (score : 20) — Concentration de connaissance sur 1 auteur principal
- [Team] Distribution de connaissance (score : 20) — Gini 0.79 — Andrew Gallant détient l'essentiel du code
- [Health] Code stagnant (score : 25) — 89% de fichiers non modifiés — normal pour un projet stable
Hotspots (churn × complexité)
| Fichier | Churn | Complexité | LOC |
|---|---|---|---|
crates/core/flags/defs.rs | 1 | 408 | 6693 |
crates/printer/src/standard.rs | 0 | 275 | 3218 |
CHANGELOG.md | 4 | 212 | 1556 |
crates/core/flags/defs.rs avec une complexité de 408 est un hotspot
structurel — fichier monolithique qui définit toutes les options CLI.
Faible churn car le projet est stable, mais risqué à modifier.
Formats de sortie
CLI
Vue terminale avec barres de progression, scores colorés et actions prioritaires.
Overall Score: ███████████░░░ 72/100
▸ Health ████████░░░░ 63/100
▸ Team ████████░░░░ 73/100
▸ Evolution ████████░░░░ 65/100
▸ Git Hygiene ███████████░ 93/100 HTML autonome
Rapport interactif en fichier unique — CSS, JS et données inlinés. Fonctionne hors ligne, thème sombre, responsive. Avec onglets Hotspots, Couplage, Ownership, Tendances, Dépendances.
Voir le rapport live de barad-dur →JSON
Sortie structurée pour intégration CI/CD. Utilisable avec
--json -o report.json pour alimenter des dashboards
ou des quality gates.
barad-dur gate . --min-score 70
# exit 0 si score ≥ 70, exit 1 sinon