Infer CODEOWNERS from git history with confidence scoring, knowledge graphs, expertise decay detection, bus factor analysis, and team topology inference. CI-native.
Project description
checkowners
Infer CODEOWNERS from git history with confidence scoring, a knowledge graph, expertise decay detection, bus factor analysis, team topology inference, review load balancing, and onboarding paths. Pure git, no LLMs. CI-native: structured JSON output, GITHUB_OUTPUT integration, composite GitHub Action.
Ownership is not binary. checkOwners is the first CODEOWNERS tool that treats it as a confidence-scored spectrum and surfaces the second-order risks (bus factor, expertise decay, team topology) that come with it.
How it works
flowchart LR
Git[Git history] --> Analyze[analyze]
Analyze --> State[(state.json)]
State --> Generate[generate]
State --> Drift[drift]
State --> Bus[bus-factor]
State --> Decay[decay]
State --> Topology[topology]
State --> Balance[balance]
State --> Onboard[onboard]
Generate --> CO[CODEOWNERS]
Drift --> CI[CI output]
Installation
pip install checkowners # core CLI
pip install "checkowners[graph]" # adds networkx-backed graph / topology / onboard
Quick start
# Confidence-scored ownership inference
checkowners analyze
# Write CODEOWNERS with owners ranked by expertise confidence
checkowners generate
# Compare inferred vs current CODEOWNERS, ranked by confidence delta
checkowners drift
# Validate syntax (no git access)
checkowners validate
All commands accept --json and persist their results to ~/.checkowners/state.json so downstream commands can reuse the analysis.
Commands
| Command | What it does |
|---|---|
checkowners analyze |
Infer ownership with confidence scores, bus factor, decay warnings |
checkowners generate |
Write CODEOWNERS, ordered by confidence; optional inline annotations |
checkowners print |
Print inferred ownership to stdout |
checkowners validate |
Validate existing CODEOWNERS syntax |
checkowners drift |
Compare inferred vs current; severity + max confidence delta |
checkowners notify |
POST drift to a webhook gated by severity_threshold |
checkowners sync |
Generate CODEOWNERS and commit the result |
checkowners expertise <path> |
Per-path expertise ranking |
checkowners decay |
Detect dormant owners; recommend transfers |
checkowners graph [--export dot] |
Render the contributor / file / team graph |
checkowners bus-factor [<path>] [--all] |
Per-path bus factor with backup-reviewer suggestions |
checkowners topology |
Infer team boundaries from commit co-occurrence |
checkowners balance |
Detect overloaded reviewers and propose rebalancing |
checkowners onboard <path> |
Generate a learning path from broad-ownership to deep-expertise files |
Documentation
- docs/USAGE.md: full configuration reference, confidence scoring formula, drift severity tiers, GitHub Actions integration, comparison table.
- docs/FAQ.md: identity (usernames vs emails, teams + subteams), GitHub API access, file locations, tuning, troubleshooting.
- docs/CONTRIBUTING.md: dev setup, commands, conventional commits, code conventions, PR workflow.
- docs/CHANGELOG.md: release history.
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file checkowners-0.3.0.tar.gz.
File metadata
- Download URL: checkowners-0.3.0.tar.gz
- Upload date:
- Size: 63.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
07cbb09cd40a42ec54e5054fd4caaa8fff5adb49baa320e656b4827c3b0106ce
|
|
| MD5 |
a9aa3b170550a21ad38081037b100e81
|
|
| BLAKE2b-256 |
92ae079ba14db2fcdbbd38b12cef86508aef371175e60ab7c3225f83d249d6af
|
Provenance
The following attestation bundles were made for checkowners-0.3.0.tar.gz:
Publisher:
publish.yml on smusali/checkowners
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
checkowners-0.3.0.tar.gz -
Subject digest:
07cbb09cd40a42ec54e5054fd4caaa8fff5adb49baa320e656b4827c3b0106ce - Sigstore transparency entry: 1741057174
- Sigstore integration time:
-
Permalink:
smusali/checkowners@03f09a0613fafdf4a73dece19ea9d5904ae96268 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/smusali
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@03f09a0613fafdf4a73dece19ea9d5904ae96268 -
Trigger Event:
release
-
Statement type:
File details
Details for the file checkowners-0.3.0-py3-none-any.whl.
File metadata
- Download URL: checkowners-0.3.0-py3-none-any.whl
- Upload date:
- Size: 38.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8ecd34f6580b55ed3660ec44e5f703c25c854906c85a7091164b60f49326e7eb
|
|
| MD5 |
b02575f2fcb0494fe05e5368b63fc8ce
|
|
| BLAKE2b-256 |
a4c9914065075011db880bb5908ef6cb056da3c46a749c485a57ce9a9259cf36
|
Provenance
The following attestation bundles were made for checkowners-0.3.0-py3-none-any.whl:
Publisher:
publish.yml on smusali/checkowners
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
checkowners-0.3.0-py3-none-any.whl -
Subject digest:
8ecd34f6580b55ed3660ec44e5f703c25c854906c85a7091164b60f49326e7eb - Sigstore transparency entry: 1741057313
- Sigstore integration time:
-
Permalink:
smusali/checkowners@03f09a0613fafdf4a73dece19ea9d5904ae96268 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/smusali
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@03f09a0613fafdf4a73dece19ea9d5904ae96268 -
Trigger Event:
release
-
Statement type: