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
Coupling
- Afferent coupling — modules qui dépendent de ce fichier
- Efferent coupling — modules dont ce fichier dépend
- Graphe d'imports — graphe de dépendances statiques navigable, cycles mis en évidence
- Change coupling smells — fichiers qui changent toujours ensemble sans lien structurel, avec exclusion automatique des paires attendues (lockfiles, paires de tests, index de modules)
Analyse des packages disponible via --deps (Cargo, npm, pip, NuGet)
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
Visualiser l'architecture réelle : le graphe d'imports
Le rapport HTML inclut un graphe de dépendances interactif construit à partir des imports statiques du code — pas de la documentation, du code tel qu'il est. Un clic sur un nœud isole son voisinage immédiat ; les dépendances circulaires apparaissent en arêtes rouges pointillées.
- Click-to-focus — explorer le voisinage d'un fichier sans le bruit du reste du graphe
- Cycles en évidence — les dépendances circulaires sautent aux yeux au lieu de se cacher dans une liste
- Regroupement par répertoire et filtre par degré minimal — pour les gros dépôts
- Export SVG — pour intégrer le graphe dans une doc d'architecture
- Liens profonds —
#tab=graph&file=src/scorer.rs: chaque vue se partage par URL
Les données brutes (import_edges, import_cycles) sont aussi
exposées dans la sortie JSON pour vos propres outils.
Installation et utilisation
Installer
cargo install barad-dur Ou via Docker :
docker pull lab.frogg.it:5050/edouard_mangel/barad-dur:latest
docker run --rm -v /chemin/du/repo:/repo \
lab.frogg.it:5050/edouard_mangel/barad-dur \
analyze .
Images signées avec cosign —
vérifiables avec la clé publique cosign.pub du dépôt.
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.17.3" # 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 12 juin 2026 (v0.17.3) — un projet en développement actif avec 2 contributeurs, et un projet open-source mature.
barad-dur 2 contributeurs, en développement actif
Actions recommandées
- [Health] Bus factor (score : 25) — Augmenter la revue de code et le pair programming pour diffuser la connaissance
- [Health] Hotspots complexes (score : 25) — Prioriser le refactoring des fichiers à haute complexité et fort churn
- [Health] Risque churn mono-auteur (score : 25) — 61 fichiers à fort churn avec un seul propriétaire
Hotspots (churn × complexité)
| Fichier | Churn | Complexité | LOC | Bugs |
|---|---|---|---|---|
.gitlab-ci.yml | 62 | 53 | 559 | 27 |
src/renderer/html.rs | 52 | 0 | 55 | 14 |
src/main.rs | 51 | 1 | 19 | 12 |
src/scorer.rs | 39 | 2 | 452 | 9 |
Couplage temporel
| Fichier A | Fichier B | Co-changements |
|---|---|---|
src/renderer/json.rs | src/scorer.rs | 70% |
src/lib.rs | src/main.rs | 60% |
src/main.rs | src/scorer.rs | 33% |
Le couplage src/renderer/json.rs / src/scorer.rs à 70% révèle
que le rendu JSON et le moteur de scoring évoluent souvent ensemble —
signal que le scorer pilote encore trop directement la forme de sortie.
BurntSushi/ripgrep Projet mature, fenêtre 6 mois — faible activité attendue
Actions recommandées
- [Team] Distribution du savoir (score : 20) — Gini 0.79 — encourager les contributions croisées et la rotation de l'ownership
- [Health] Bus factor (score : 25) — 100% des fichiers dominés par un seul auteur
- [Health] God objects (score : 25) — 22 fichiers trop larges à découper en modules plus petits
Hotspots (churn × complexité)
| Fichier | Churn | Complexité | LOC | Bugs |
|---|---|---|---|---|
crates/ignore/src/dir.rs | 2 | 83 | 937 | 1 |
crates/core/flags/defs.rs | 1 | 51 | 6583 | 0 |
crates/ignore/src/walk.rs | 0 | 127 | 1617 | 0 |
crates/printer/src/standard.rs | 0 | 101 | 3148 | 0 |
crates/core/flags/defs.rs avec une complexité de 51 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: █████████░░░░░ 66/100
▸ Health █████░░░░░░░ 37/100
▸ Team ████████████ 100/100
▸ Evolution █████████░░░ 65/100
▸ Git Hygiene ███████████░ 92/100
▸ Coupling ██████████░░ 81/100 HTML autonome
Rapport interactif en fichier unique — CSS, JS et données inlinés. Fonctionne hors ligne, thème sombre, responsive. Onze onglets : Overview, Hotspots, Couplage, Graphe d'imports, Ownership, Âge, Treemap, Tendances, Auteurs, Dépendances, Audit. Les onglets sont connectés entre eux, et l'onglet + fichier sélectionnés sont reflétés dans l'URL — chaque vue est partageable en lien direct.
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