busfactor について
busfactor は、渡されたコミット数とレビュアー情報から、ファイルごとの著者集中度と外部レビュー状況を示します。単一著者が支配し、外部レビューもないファイルを抽出し、リポジトリのファイル自体は読み取りません。
主な機能
- 01ファイル別の著者・コミット統計
- 02最多著者の割合と閾値判定
- 03外部レビュアー数の集計
- 04リスク対象ファイルと件数の要約
- 05順序が安定した結果
- 06ローカル CLI と MCP サーバー
活用シーン
- 01著者が集中しているファイルの特定
- 02外部レビューのないファイルの確認
- 03チーム変更前のリスクパス確認
MCP 対応
MCP サーバーは `analyze_bus_factor` を提供します。ファイルの著者・レビュアー情報と任意の集中度閾値を受け取り、ファイル情報、リスク対象パス、集計結果を返します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
1掲載時のツール一覧 · 1 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| files | array | はい | 著者とレビューのデータを含むファイル(1 件以上) |
| threshold | number | いいえ | ファイルが単一の作者に支配されているとみなす、作者の最大シェア(任意、デフォルトは 0.8、> 0 かつ <= 1) |
詳細
busfactor
すべてのコードベースには、実質的に一人しか把握していないファイルがあります。 その人が休暇中、病欠、あるいはチームを離れた場合、そのファイルは安全に変更できる人がいなくなります。busfactor は、そうしたリスクがどこにあるかを算出します。各ファイルについて、誰が作成したか、各作成者が何回コミットしたか、さらに誰が変更をレビューしたかを渡すと、事実に基づく一覧が返されます。
- ファイルごとの項目 — 各ファイルの
total_commits、異なる作成者の数、top_authorと、その作成者がファイルのコミットに占めるtop_share、およびexternal_reviewers(ファイルのレビュアーのうち、ファイルの作成者ではない人の数)を示します。ファイルの作成者自身によるレビューは外部レビューとして数えないため、作成者だけが確認したファイルは未レビューとして扱われます。 - 2つのフラグと1つのリスト — ファイルは、最も多くコミットした作成者の割合がしきい値(デフォルトでは 0.8)に達すると
dominatedになります。また、外部レビュアーがいない場合はnever_reviewedになります。両方に該当するファイルはat_riskとなり、at_risk_filesに該当するパスのみが格納されます。このリストが示すのは、貢献の集中度とレビューの網羅性に関する事実であり、関係者への評価ではありません。 - 概要の件数 — 分析したファイル数、リスクのあるファイル数、作成者が1人のファイル数、外部レビューを受けていないファイル数を示します。
同一ファイル内で作成者名が重複している場合は、計算前にコミット数を合算し、レビュアー名は重複を除去します。最も多くコミットした作成者の割合は小数点以下4桁に丸めます。支配的かどうかの判定では、レポートに表示されるこの丸め後の割合をしきい値と比較するため、ちょうどしきい値として報告されるファイルは必ず dominated と判定されます。結果内のすべてのリストは昇順に並べ替えられるため、同じデータからは常にまったく同じ一覧が得られます。ファイルリストの欠落や空欄、パスの重複、コミット数が設定されていない作成者など、不正な入力がある場合は、該当するパスを示す検証エラーが発生します(例:files[1].authors[0].commits must be an integer >= 1)。途中までの一覧は生成されません。計算は純粋かつローカルに行われます。ネットワークや設定は不要で、渡された入力以外のファイルを読み込むこともありません。
CLI
npx @reneturcios/busfactor analyze --input args.json
npx @reneturcios/busfactor --version
args.json には引数オブジェクト全体を指定します。
{
"files": [
{ "path": "src/solo.ts", "authors": [{ "name": "amy", "commits": 10 }] },
{
"path": "src/shared.ts",
"authors": [
{ "name": "amy", "commits": 5 },
{ "name": "bob", "commits": 5 }
],
"reviewers": ["amy", "cleo"]
}
]
}
各ファイルの reviewers のデフォルト値は []、threshold のデフォルト値は 0.8 です。ここでは src/solo.ts は作成者が1人で未レビュー、src/shared.ts は均等に分担され、cleo による外部レビューを受けています。結果の一覧は JSON として出力されます。
{
"files": [
{
"path": "src/shared.ts",
"total_commits": 10,
"distinct_authors": 2,
"top_author": "amy",
"top_share": 0.5,
"external_reviewers": 1,
"never_reviewed": false,
"dominated": false,
"at_risk": false
},
{
"path": "src/solo.ts",
"total_commits": 10,
"distinct_authors": 1,
"top_author": "amy",
"top_share": 1,
"external_reviewers": 0,
"never_reviewed": true,
"dominated": true,
"at_risk": true
}
],
"at_risk_files": ["src/solo.ts"],
"summary": {
"total_files": 2,
"at_risk_count": 1,
"single_author_count": 1,
"never_reviewed_count": 1
}
}
終了コード:成功時は 0、実行時エラー(読み取り不能または無効な入力ファイル、入力不正を含む)の場合は 1、使用方法のエラーの場合は 2。
MCP サーバー
npx -y @reneturcios/busfactor mcp
MCP クライアントの設定:
{
"mcpServers": {
"busfactor": {
"command": "npx",
"args": ["-y", "@reneturcios/busfactor", "mcp"]
}
}
}
ツール
-
analyze_bus_factor— 作成者情報とレビューデータから、作成者が1人のファイルと未レビューのファイルを特定します。files(配列、必須、1件以上)—{path, authors, reviewers?}オブジェクトとして指定するファイル。pathはファイル間で一意である必要があります。各authorsエントリーは{name, commits}の組で、コミット数は1以上である必要があります。reviewersには、そのファイルへの変更をレビューした人の名前を指定します。threshold(数値、省略可、デフォルト 0.8)— これ以上の場合に、ファイルが1人の作成者に支配されていると判定する、その作成者のコミット割合。0より大きく、1以下である必要があります。
{files, at_risk_files, summary}を返します。
Docker
docker run -i ghcr.io/cloudcorprecords/busfactor
docker run --rm -v "$PWD:/w" ghcr.io/cloudcorprecords/busfactor analyze --input /w/args.json
開発
npm install
npm run build # tsc -> dist/
npm test # tsx --test test/*.test.ts (pure local, no network)
npm run dev # run the CLI from source
ライセンス
MIT — Copyright (c) 2026 Rene Turcios
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。