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.

35%

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
20%

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
20%

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)

15%

Git Hygiene

  • Qualité des messages — commits conventionnels, messages vides
  • Propreté de l'historique — merges octopus, squash ratio
  • Couverture .gitignore — fichiers suspects trackés
10%

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.

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

barad-dur-report.html

Rapport interactif autonome, accessible depuis l'onglet "Artifacts" de GitLab. Aucune dépendance externe.

barad-dur-report.json

Données brutes structurées. Exploitables par d'autres jobs, des dashboards Grafana, ou des scripts de monitoring.

Quality gate

Exit code non-nul si score < seuil. S'intègre naturellement dans les règles de protection de branche GitLab.

Le composant utilise 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

512 commits · 2 auteur · 181 fichiers
66 /100
Health
37
17 fichiers à haute complexité et fort churn
Team
100
Petite équipe (2 auteurs) — métriques N/A
Evolution
65
24% des commits investis en refactoring
Git Hygiene
92
99% de bons messages, 91% conventionnels
Coupling
81
0 cycle sur 138 arêtes d'import — mais 104 paires de co-changements inter-modules

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é)

FichierChurnComplexitéLOCBugs
.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 AFichier BCo-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

11 commits (6 mois) · 5 auteurs · 197 fichiers
73 /100
Health
54
22/101 fichiers sources trop larges (21.8%)
Team
63
Gini 0.79 — connaissance très concentrée, 3 silos de répertoires
Evolution
75
Stable — +2 fichiers, +139 lignes ; âge médian du code : 32 mois
Git Hygiene
82
45% de bons messages, 36% conventionnels
Coupling
100
Aucune dépendance d'import circulaire détectée

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é)

FichierChurnComplexitéLOCBugs
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.

Ce que les chiffres ne disent pas seuls : ripgrep est l'un des projets Rust les plus qualitatifs qui soit. Un score de 73 sur une fenêtre 6 mois reflète la maturité du projet — faible activité (11 commits), code stable, et couplage structurel parfait. Le principal risque identifié est la concentration du savoir sur son mainteneur historique : avec un peu plus d'activité dans la fenêtre, les métriques d'équipe deviennent calculables et révèlent un Gini de 0,79. Barad-Dur identifie les risques organisationnels, pas la qualité absolue.

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