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%

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

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

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

369 commits · 1 auteur · 257 fichiers
72 /100
Git Hygiene
93
99% de commits conventionnels
Team
73
Ownership 100% clair
Evolution
65
26% des commits investis en refactoring
Health
63
18 paires de couplage temporel détectées

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

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

26 commits (6 mois) · 8 auteurs · 219 fichiers
63 /100
Git Hygiene
73
Historique propre, 0 merge commit
Team
67
8 contributeurs actifs
Evolution
58
Code âgé de 29 mois en médiane — projet stable
Health
55
89% des fichiers non touchés dans la fenêtre

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

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

Ce que les chiffres ne disent pas seuls : ripgrep est l'un des projets Rust les plus qualitatifs qui soit. Un score de 63 sur une fenêtre 6 mois reflète simplement la maturité du projet — faible activité, code vieillissant car stable, connaissance concentrée sur son mainteneur historique. 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: ███████████░░░ 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