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 'Could not release installation lock at %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 'Move conflict recovery failed; staged data remains at %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掃描 - 跨模組分析有助於檢測子專案間的重複項目