engleader.tools source
open source · v0.1.0

Engineering metrics from your terminal.

DORA metrics, PR health, code churn, and contributor analysis. Bash scripts, the GitHub CLI, and jq. No SaaS, no data leaving your machine.

quick start
$ brew tap georgemandis/tap
$ brew install eng-leader-tools

$ eng lead-time my-org/my-repo
$ eng review-time my-org/my-repo 50
$ eng change-failure-rate my-org/my-repo
$ eng code-churn my-org/my-repo 30 3

All output goes to stdout.

Pipe, redirect, or just read it.

Measurements,
not grades.

Everything worth measuring is already in the GitHub API. These scripts just ask for it. No vendor, no dashboard, no $30k platform — just your terminal.

§ 01 — install

Install

01macos / linux

Homebrew

brew tap georgemandis/tap
brew install eng-leader-tools
02windows

Scoop

scoop bucket add georgemandis https://github.com/georgemandis/scoop-bucket
scoop install eng-leader-tools
03anywhere

Manual

git clone https://github.com/georgemandis/eng-leader-tools
cd eng-leader-tools
# Add to PATH, or run scripts directly.
# Pick and choose the ones you need.
prerequisites
§ 02 — commands

17 tools, one interface.

Each script also stands on its own. The eng wrapper is a convenience, not a requirement.

DORA Metrics

Research-backed baselines for delivery health. Learn more at dora.dev

  • eng lead-time Average time from PR creation to merge
    $ eng lead-time acme-corp/api
    
    PR#      Author          Lead Time    Created              Merged
    ────────────────────────────────────────────────────────────────────
    #812     alice           4h           2026-04-28T09:12Z    2026-04-28T13:45Z
    #809     bob             1d 6h        2026-04-26T14:00Z    2026-04-27T20:30Z
    #807     charlie         2d           2026-04-24T11:00Z    2026-04-26T11:15Z
    #804     diana           8h           2026-04-23T08:30Z    2026-04-23T16:45Z
    #801     alice           3h           2026-04-22T10:00Z    2026-04-22T13:10Z
    
    Analyzed 5 PR(s) • Average lead time: 18 hours
  • eng lead-time-user Lead time filtered to a specific contributor
    $ eng lead-time-user acme-corp/api alice 60
    
    PR#      Lead Time    Created              Merged
    ──────────────────────────────────────────────────────────
    #812     4h           2026-04-28T09:12Z    2026-04-28T13:45Z
    #801     3h           2026-04-22T10:00Z    2026-04-22T13:10Z
    #788     6h           2026-04-15T09:00Z    2026-04-15T15:20Z
    
    alice: 3 PR(s) • Average lead time: 4 hours
  • eng change-failure-rate Percentage of merged PRs flagged as rollbacks or hotfixes
    $ eng change-failure-rate acme-corp/api 30
    
    →  Total merged PRs in last 30 days: 47
    →  PRs flagged as failures: 2
    →  Change Failure Rate: 4.26%
    
    Failed PRs:
      • #798  rollback: revert auth token migration
      • #803  hotfix: patch rate limiter crash
  • eng deploy-frequency How often releases ship, with DORA tier assessment
    $ eng deploy-frequency acme-corp/api 90
    
    Deployment Activity:
    • Releases in last 90 days: 11
    • Using releases for analysis
    
    Average deployment frequency: Every 8.2 days
    
    Recent Deployments:
    Date         Version        Time Since Previous
    ────────────────────────────────────────────────
    2026-04-29   v2.14.0        6 days
    2026-04-23   v2.13.1        4 days
    2026-04-19   v2.13.0        12 days
    2026-04-07   v2.12.0        9 days
    
    DORA Assessment:
    • 🟢 High: Between once per day and once per week

PR Health

  • eng review-time Time to first review and time to merge
    $ eng review-time acme-corp/api 20
    
    PR#    1st Rev  Merge   Reviews  Author
    ────────────────────────────────────────────
    #812   1h       4h      2        alice
    #809   3h       1d 6h   3        bob
    #807   N/A      2d      0        charlie
    #804   45m      8h      1        diana
    
    Summary:
    • Total PRs analyzed: 4
    • Average time to merge: 20h
    • Average time to first review: 1h 35m
    • PRs with reviews: 3/4 (75%)
    
    Process Health:
    • 🟢 Review responsiveness: Good (1h 35m avg)
    • 🟡 Review coverage: 75% — 1 PR merged without review
  • eng pr-size PR size distribution (XS–XL), correlated with review time
    $ eng pr-size acme-corp/api
    
    Size Distribution:
    Size  Count  %      Avg Review Time
    ────────────────────────────────────
    XS    6      12%    45m
    S     14     28%    2h
    M     18     36%    4h
    L     9      18%    9h
    XL    3      6%     1d 4h
    
    Summary:
    • Total PRs analyzed: 50
    • Average lines per PR: 182 (+112 -70)
    
    🟢 40% small PRs (XS/S) — healthy distribution
    🟡 Large PRs take 6x longer to review than small ones
  • eng files-per-pr Files changed per merged PR
    $ eng files-per-pr acme-corp/api
    
    PR#    Files  Author          Title
    ──────────────────────────────────────────────────────
    #812   3      alice           Fix auth token refresh
    #809   8      bob             Add rate limiting middleware
    #807   2      charlie         Update API docs
    #804   14     diana           Refactor database layer
    
    Analyzed 4 PRs • Total files changed: 27 • Average: 6.8 files/PR
  • eng files-per-pr-live Files changed per open PR, flags large ones
    $ eng files-per-pr-live acme-corp/api
    
    PR#    Files  Author          Title
    ──────────────────────────────────────────────────────
    #815   4      eve             Add webhook support
    #814   18     frank           Migration to new ORM
    #813   2      alice           Fix typo in error message
    
    Analyzed 3 open PRs • Average: 8.0 files/PR
    
    Large PRs (>10 files) that may need extra review attention:
      • #814 (18 files): Migration to new ORM
  • eng stale-prs Open PRs grouped by age
    $ eng stale-prs acme-corp/api
    
    Open PRs for acme-corp/api: 9 total
    
    < 1 day (2)
    ────────────────────────────────────────────────────
    #815  eve       0d old  Add webhook support
    #813  alice     0d old  Fix typo in error message
    
    1-3 days (3)
    ────────────────────────────────────────────────────
    #814  frank     2d old  Migration to new ORM [draft]
    
    3-7 days (1)
    ────────────────────────────────────────────────────
    #810  bob       5d old  Refactor auth middleware
    
    30+ days (1)
    ────────────────────────────────────────────────────
    #762  charlie   42d old  Experimental caching layer
    
    1 of 9 PRs (11%) are older than 2 weeks.
    Consider reviewing for closure or re-prioritization.
  • eng quick-reviews Small open PRs that need a quick approval
    $ eng quick-reviews -o acme-corp -r api
    
    2026-04-30 • Fix typo in error message • github.com/acme-corp/api/pull/813
    2026-04-28 • Update CI badge in README • github.com/acme-corp/api/pull/811
  • eng review-load How review work is distributed across the team
    $ eng review-load acme-corp/api
    
    Review Load Distribution:
    Reviewer        Total  Approved  Changes  Comments
    ────────────────────────────────────────────────────
    alice              18        14        2         2
    bob                12         8        3         1
    charlie             4         3        0         1
    diana               2         2        0         0
    
    Summary:
      PRs analyzed:      50
      Total reviews:     36
      Unique reviewers:  4
      Avg reviews/PR:    0.72
    
    Load Balance:
      alice is handling 50% of all reviews — consider redistributing.
      2 contributor(s) authored PRs but gave no reviews.

Codebase & Contributors

  • eng code-churn File hotspots — files changed repeatedly across PRs
    $ eng code-churn acme-corp/api 30 3
    
    File Hotspots (changed ≥3 times in 30 days):
    Times  File Path
    ──────────────────────────────────────────────
    7      src/auth/tokens.ts
    5      src/middleware/rate-limit.ts
    4      tests/auth.test.ts
    3      src/db/migrations/latest.ts
    
    Top Churn Directories:
      3 changes in src/auth
      2 changes in src/middleware
    
    Risk Assessment:
    • 🔴 High: 1 file changed ≥5 times
    • 🟡 Medium: 2 files changed 3-4 times
    
    Most Churned: src/auth/tokens.ts (7 changes, 28% of PRs)
  • eng contributor-patterns Per-contributor PR size patterns (focused vs. broad-scope)
    $ eng contributor-patterns acme-corp/api
    
    Contributor File Change Patterns:
    Author          PRs  Total   Avg    Max
    ──────────────────────────────────────────
    diana             8    96    12.0    28
    bob               7    63     9.0    18
    alice            12    30     2.5     5
    charlie           5    12     2.4     4
    
    Pattern Analysis:
    • Focused contributors (avg <3 files/PR):
      - alice (2.5)
      - charlie (2.4)
    
    • Broad-scope contributors (avg >10 files/PR):
      - diana (12.0)
  • eng lottery-factor Knowledge concentration risk — bus factor by file
    $ eng lottery-factor acme-corp/api
    
    Single-Contributor Files (highest risk):
    Chgs  Only Author   File
    ────────────────────────────────────────────────────
    8     alice         src/auth/tokens.ts
    6     bob           src/db/migrations/latest.ts
    5     charlie       tools/deploy.sh
    
    Directory-Level Risk:
    Files  Risk  Directory
    ────────────────────────────────────────
    3      HIGH  src/auth
    2      MED   src/db
    1      LOW   tools
    
    Overall:
      26% of active files have a single contributor
      Consider pairing or rotating reviewers.
  • eng dependency-changes Dependency update PRs, security flags, automation rate
    $ eng dependency-changes acme-corp/api 90
    
    #791  2026-04-18  dependabot        🔒 🤖
          Bump express from 4.18.2 to 4.19.0
    #785  2026-04-11  renovate          🤖
          Update typescript to 5.5
    #770  2026-03-28  dependabot        🔒 🤖
          Bump lodash from 4.17.20 to 4.17.21
    
    Summary:
    • Dependency PRs: 14 of 100 (14%)
    • Security updates: 3
    • Avg frequency: Every 6.4 days
    • 🤖 Automation rate: 90%
    • 🟢 Active dependency management
  • eng contributions A user's review and comment activity across an org
    $ eng contributions alice acme-corp 30
    
    Date         Repo                PR#    Author     Comments  Status
    ──────────────────────────────────────────────────────────────────────
    2026-04-29   acme-corp/api       #812   bob        2         ✓ Approved
    2026-04-27   acme-corp/api       #809   charlie    1         ✓ Approved
    2026-04-25   acme-corp/web       #344   diana      3         ⚠ Changes Req
    2026-04-22   acme-corp/api       #801   eve        1         ✓ Approved
    
    Summary:
    • PRs reviewed/commented: 4
    • Total comments: 7
    • Approvals: 3  •  Change requests: 1
    • Avg comments/PR: 1.8

Discussion Tools

  • eng pull-discussion Full PR discussion as structured text
    $ eng pull-discussion acme-corp/api 812
    
    PR Details:
    Title:   Fix auth token refresh
    Author:  alice
    State:   merged
    +45 -12
    
    Changed Files:
    • src/auth/tokens.ts (+30 -8)
    • src/auth/session.ts (+15 -4)
    
    Discussion:
    ───
    bob (COLLABORATOR) • 2026-04-28T10:15Z
    src/auth/tokens.ts:42
    Should we add a retry here for transient failures?
    Reactions: +1: 2
    
    ───
    alice (AUTHOR) • 2026-04-28T11:00Z
    Good call. Added exponential backoff in latest push.
  • eng analyze-discussion Pipe a PR discussion into an LLM for summarization
    $ eng pull-discussion acme-corp/api 812 | eng analyze-discussion
    
    This PR fixes a bug where auth tokens were not being refreshed
    correctly after expiry. Bob raised a concern about transient
    network failures during refresh, which Alice addressed by adding
    exponential backoff. Both reviewers approved after the update.
    No unresolved disagreements.
csv output

Many commands support --csv for machine-readable output. All commands support --help.

These tools grew out of years of managing and directing engineering teams. I wanted a way to check the barometer — not to grade anyone, but to calibrate my understanding of how things were going.

Mostly they confirmed what I already suspected, which is actually the point. I could see who our busiest reviewers were, where PR sizes were creeping up, who the "glue" people were connecting different parts of the org. Having it in front of me made it concrete. It gave me better questions to ask.

This kind of analysis already exists in enterprise platforms, but those cost real money and come with more dashboard than most teams need. If you use GitHub, everything worth measuring is already in the API.

§ 04 — about

Built by George Mandis.

20+ years building software, 5 years leading the people who build it. Previously director of engineering at Axios HQ. Currently doing a batch at the Recurse Center and building tools under Less Software.

a less software product

Less Software

I keep building small tools like this one. Minimal dependencies, clear output, no more moving parts than necessary. Less Software is the practice.