Instant health check for any git repository.
git-pulse scans git history and builds a compact engineering-health report:
- Churn hotspots: files changed most often, with risk hints.
- Bus factor: ownership concentration, inactive key contributors, single-owner risks.
- Bug clusters: files frequently touched in bug-fix commits.
- Team velocity: monthly activity trend and sharp drop/growth anomalies.
- Crisis patterns:
revert,hotfix,emergency,rollbackevent density. - Temporal coupling: files that repeatedly change together.
- Health score: explainable penalties + prioritized actions.
- Built for terminal-first workflows: TUI, plain text, JSON, Markdown.
- Deterministic JSON contract for CI integrations.
- Fast enough for very large repositories via lazy diff loading + caching.
- Policy mode for release gates (
check --min-health,--fail-on, etc.).
# from crates.io
cargo install git-pulse
# or from source checkout
cargo install --path .brew install --HEAD ./Formula/git-pulse.rb# run once
nix run .
# install to profile
nix profile install .curl -fsSL https://raw.githubusercontent.com/balyakin/git-pulse/main/scripts/install.sh | sh# Interactive TUI
git-pulse
# Plain output
git-pulse --format plain
# JSON for CI
git-pulse --format json --no-color
# Markdown report to file
git-pulse --format markdown -o report.md
# Analyze a specific branch and period
git-pulse --branch main --period 6mgit-pulse --save-baseline .gitpulse-baseline.json
git-pulse --compare-baseline .gitpulse-baseline.jsongit-pulse check --fail-on critical
git-pulse check --min-health 70
git-pulse check --max-high-risk-files 3Policy failure exits with code 2.
| Feature | git-pulse | git-quick-stats | hercules | gitinspector |
|---|---|---|---|---|
| Interactive TUI dashboard | ✅ | ❌ | ❌ | ❌ |
| Deterministic JSON contract | ✅ | ❌ | ❌ | |
| CI policy gate mode | ✅ | ❌ | ❌ | ❌ |
| Explainable health score | ✅ | ❌ | ❌ | ❌ |
| Temporal coupling analyzer | ✅ | ❌ | ✅ | ❌ |
| Crisis-pattern detection | ✅ | ❌ | ❌ | ❌ |
Optional .gitpulse.toml in repository root:
[ignore]
patterns = ["*.generated.ts", "vendor/*"]
[analysis]
period = "12m"
top = 20
include_merges = false
detect_squash = true
[authors.aliases]
"john@company.com" = ["john.doe@company.com"]
[thresholds]
bus_factor_critical = 0.60
bus_factor_warning = 0.40
crisis_rate_warning = 2
crisis_rate_critical = 4
velocity_drop_warning = 0.50
[bugs]
extra_keywords = ["patch", "workaround", "hack"]MIT
