repo-scan は何をしますか?
すべてのエコシステムには独自の依存関係マネージャーがありますが、C++、Android、iOS、Webを横断して「実際にあなたのコードはどれだけあるのか」「サードパーティのコードは何か」「デッドウェイトは何か」を教えてくれるツールは他にありません。
使用するタイミング
- 大規模なレガシーコードベースを引き継ぎ、構造的な概要が必要な場合
- 大規模リファクタリングの前 — コアなコード、重複、デッドコードを特定する
- パッケージマネージャーで宣言されていない、ソースに直接埋め込まれたサードパーティ依存関係を監査する場合
- モノレポ再編成のためのアーキテクチャ決定記録を準備する場合
インストール
# まずクローンして、固定されたコミットをインストール前にレビューできるようにする
set -euo pipefail
REPO_SCAN_COMMIT=2742664ebcad1450c208eda0ae45d3c17fad5dd8
REPO_SCAN_INSTALL_DIR="${CLAUDE_CONFIG_DIR:-$HOME/.claude}/skills/repo-scan"
REPO_SCAN_INSTALL_PARENT="$(dirname "$REPO_SCAN_INSTALL_DIR")"
mkdir -p "$REPO_SCAN_INSTALL_PARENT"
REPO_SCAN_TMP="$(mktemp -d "$REPO_SCAN_INSTALL_PARENT/.repo-scan-install.XXXXXX")"
REPO_SCAN_TOKEN="${REPO_SCAN_TMP##*.}"
REPO_SCAN_STAGE="$REPO_SCAN_TMP/stage-$REPO_SCAN_TOKEN"
REPO_SCAN_BACKUP="$REPO_SCAN_TMP/backup-$REPO_SCAN_TOKEN"
REPO_SCAN_LOCK="$REPO_SCAN_INSTALL_PARENT/.repo-scan-install.lock"
REPO_SCAN_KEEP_TMP=0
REPO_SCAN_LOCK_HELD=0
REPO_SCAN_MV_HAS_NO_TARGET=0
cleanup_repo_scan_install() {
if [ "$REPO_SCAN_KEEP_TMP" -eq 0 ]; then
rm -rf -- "$REPO_SCAN_TMP"
fi
if [ "$REPO_SCAN_LOCK_HELD" -eq 1 ] && ! rmdir -- "$REPO_SCAN_LOCK"; then
printf 'インストールロック %s を解放できませんでした\n' "$REPO_SCAN_LOCK" >&2
fi
}
trap cleanup_repo_scan_install EXIT
mkdir "$REPO_SCAN_TMP/mv-probe-source"
if mv -T -- "$REPO_SCAN_TMP/mv-probe-source" \
"$REPO_SCAN_TMP/mv-probe-destination" 2>/dev/null; then
REPO_SCAN_MV_HAS_NO_TARGET=1
rmdir "$REPO_SCAN_TMP/mv-probe-destination"
else
rmdir "$REPO_SCAN_TMP/mv-probe-source"
fi
move_repo_scan_dir() {
REPO_SCAN_MOVE_SOURCE=$1
REPO_SCAN_MOVE_DESTINATION=$2
REPO_SCAN_MOVE_NAME=${REPO_SCAN_MOVE_SOURCE##*/}
if [ -e "$REPO_SCAN_MOVE_DESTINATION" ] || [ -L "$REPO_SCAN_MOVE_DESTINATION" ]; then
return 1
fi
if [ "$REPO_SCAN_MV_HAS_NO_TARGET" -eq 1 ]; then
mv -T -- "$REPO_SCAN_MOVE_SOURCE" "$REPO_SCAN_MOVE_DESTINATION"
return
fi
if ! mv -- "$REPO_SCAN_MOVE_SOURCE" "$REPO_SCAN_MOVE_DESTINATION"; then
return 1
fi
if [ -e "$REPO_SCAN_MOVE_DESTINATION/$REPO_SCAN_MOVE_NAME" ] || \
[ -L "$REPO_SCAN_MOVE_DESTINATION/$REPO_SCAN_MOVE_NAME" ]; then
if ! mv -- "$REPO_SCAN_MOVE_DESTINATION/$REPO_SCAN_MOVE_NAME" \
"$REPO_SCAN_MOVE_SOURCE"; then
REPO_SCAN_KEEP_TMP=1
printf '移動の競合からの回復に失敗しました。ステージングデータは %s に残っています\n' \
"$REPO_SCAN_MOVE_DESTINATION/$REPO_SCAN_MOVE_NAME" >&2
fi
return 1
fi
}
git clone --filter=blob:none --no-checkout \
https://github.com/haibindev/repo-scan.git "$REPO_SCAN_TMP/source"
git -C "$REPO_SCAN_TMP/source" checkout --detach "$REPO_SCAN_COMMIT"
mkdir -p "$REPO_SCAN_STAGE"
git -C "$REPO_SCAN_TMP/source" archive "$REPO_SCAN_COMMIT" | \
tar -xf - -C "$REPO_SCAN_STAGE"
# インストールを承認する前に "$REPO_SCAN_TMP/source" をレビューしてください。
printf '固定されたソースをレビューした後、%s を置き換えるには install と入力してください: ' \
"$REPO_SCAN_INSTALL_DIR" >&2
read -r REPO_SCAN_CONFIRM
if [ "$REPO_SCAN_CONFIRM" != install ]; then
printf 'インストールがキャンセルされました。\n' >&2
exit 1
fi
if ! mkdir -- "$REPO_SCAN_LOCK" 2>/dev/null; then
printf '別のrepo-scanインストールがロック %s を保持しています\n' \
"$REPO_SCAN_LOCK" >&2
exit 1
fi
REPO_SCAN_LOCK_HELD=1
if [ -e "$REPO_SCAN_INSTALL_DIR" ] || [ -L "$REPO_SCAN_INSTALL_DIR" ]; then
move_repo_scan_dir "$REPO_SCAN_INSTALL_DIR" "$REPO_SCAN_BACKUP"
fi
if ! move_repo_scan_dir "$REPO_SCAN_STAGE" "$REPO_SCAN_INSTALL_DIR"; then
if [ -e "$REPO_SCAN_BACKUP" ] || [ -L "$REPO_SCAN_BACKUP" ]; then
if [ -e "$REPO_SCAN_INSTALL_DIR" ] || [ -L "$REPO_SCAN_INSTALL_DIR" ]; then
REPO_SCAN_KEEP_TMP=1
printf '置き換えに失敗し、ターゲットが再作成されました。以前のインストールは %s に保存されています\n' \
"$REPO_SCAN_BACKUP" >&2
elif ! move_repo_scan_dir "$REPO_SCAN_BACKUP" "$REPO_SCAN_INSTALL_DIR"; then
REPO_SCAN_KEEP_TMP=1
printf '置き換えとロールバックに失敗しました。以前のインストールは %s に保存されています\n' \
"$REPO_SCAN_BACKUP" >&2
fi
fi
exit 1
fi
エージェントスキルをインストールする前にソースをレビューしてください。
インストールはブートストラップのみを完了します。エージェントハーネスを再読み込みし、再び repo-scan を呼び出してください。このECCポインターは外部スキルをインストールしますが、スキャン自体は実行しません。
コア機能
| 機能 | 説明 |
|---|---|
| クロススタックスキャン | C/C++、Java/Android、iOS(OC/Swift)、Web(TS/JS/Vue)を1回でスキャン |
| ファイル分類 | すべてのファイルをプロジェクトコード、サードパーティ、ビルドアーティファクトにタグ付け |
| ライブラリ検出 | 50以上の既知ライブラリ(FFmpeg、Boost、OpenSSL…)とバージョン抽出 |
| 4段階判定 | コアアセット / 抽出&マージ / 再構築 / 非推奨 |
| HTMLレポート | ドリルダウンナビゲーションを備えたインタラクティブなダークテーマページ |
| モノレポ対応 | サマリーとサブプロジェクトレポートを含む階層スキャン |
分析深度レベル
| レベル | 読み込むファイル数 | ユースケース |
|---|---|---|
fast | モジュールあたり1〜2 | 巨大なディレクトリのクイックインベントリ |
standard | モジュールあたり2〜5 | 依存関係とアーキテクチャチェックを含むデフォルト監査 |
deep | モジュールあたり5〜10 | スレッドセーフ、メモリ管理、API一貫性を追加 |
full | すべてのファイル | マージ前の包括的レビュー |
仕組み
- リポジトリ表面を分類: ファイルを列挙し、各ファイルをプロジェクトコード、埋め込みサードパーティコード、またはビルドアーティファクトにタグ付けします。
- 埋め込みライブラリを検出: ディレクトリ名、ヘッダー、ライセンスファイル、バージョンマーカーを検査して、バンドルされた依存関係と推定バージョンを特定します。
- 各モジュールをスコアリング: ファイルをモジュールまたはサブシステムごとにグループ化し、所有権、重複、保守コストに基づいて4つの判定のいずれかを割り当てます。
- 構造的リスクを強調: デッドウェイトアーティファクト、重複ラッパー、古いベンダーコード、抽出/再構築/非推奨すべきモジュールを指摘します。
- レポートを生成: 簡潔なサマリーと、モジュールごとのドリルダウンが可能なインタラクティブHTML出力を返し、非同期で監査を確認できるようにします。
使用例
50,000ファイルのC++モノレポでの例:
- FFmpeg 2.x(2015年製)がまだ本番環境で使用されているのを発見
- 同じSDKラッパーが3回重複しているのを発見
- 636 MBのDebug/ipch/objビルドアーティファクトがコミットされているのを特定
- 分類: 3 MBのプロジェクトコード vs 596 MBのサードパーティコード
ベストプラクティス
- 初回監査では
standard深度から始める - 100モジュール以上のモノレポでは
fastを使用してクイックインベントリを取得 - リファクタリング対象としてフラグが立てられたモジュールに対して段階的に
deepを実行 - サブプロジェクト間の重複検出のためにクロスモジュール分析をレビューする