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 '請輸入 install 以在審查固定的原始碼後取代 %s:' \
"$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) |
| 檔案分類 | 每個檔案都被標記為專案原始碼、第三方程式碼或建置工件 |
| 函式庫偵測 | 超過 50 種已知函式庫(FFmpeg、Boost、OpenSSL…)並提取版本資訊 |
| 四級裁決 | 核心資產 / 提取並合併 / 重建 / 棄用 |
| HTML 報告 | 互動式深色主題頁面,支援向下鑽取導航 |
| 單一儲存庫支援 | 分層掃描,包含摘要與子專案報告 |
分析深度層級
| 層級 | 讀取檔案數 | 使用案例 |
|---|---|---|
fast | 每個模組 1-2 個 | 快速盤點大型目錄 |
standard | 每個模組 2-5 個 | 預設審計,包含完整依賴項與架構檢查 |
deep | 每個模組 5-10 個 | 新增執行緒安全性、記憶體管理、API 一致性檢查 |
full | 所有檔案 | 合併前的全面性審查 |
運作方式
- 分類儲存庫表面:列舉檔案,然後將每個檔案標記為專案原始碼、嵌入的第三方程式碼或建置工件。
- 偵測嵌入的函式庫:檢查目錄名稱、標頭檔、授權檔案與版本標記,以識別捆綁的依賴項及其可能版本。
- 為每個模組評分:按模組或子系統對檔案進行分組,然後根據所有權、重複性與維護成本分配四種裁決之一。
- 突顯結構性風險:指出無效工件、重複包裝器、過時的供應商程式碼,以及應被提取、重建或棄用的模組。
- 產出報告:回傳簡潔摘要與互動式 HTML 輸出(支援按模組向下鑽取),以便非同步審查審計結果。
範例
在一個擁有 50,000 個檔案的 C++ 單一儲存庫中:
- 發現仍在使用 FFmpeg 2.x(2015 年版)
- 發現相同的 SDK 包裝器重複了 3 次
- 辨識出 636 MB 已提交的 Debug/ipch/obj 建置工件
- 分類結果:3 MB 專案原始碼 vs 596 MB 第三方程式碼
最佳實務
- 首次審計時從
standard深度開始 - 對擁有 100 個以上模組的單一儲存庫使用
fast以快速盤點 - 針對標記為重構的模組,逐步執行
deep掃描 - 檢視跨模組分析以偵測子專案間的重複