Gitリポジトリを再帰的に検出し、状態変更をキャプチャし、差分を生成し、完全なスニペットを含むコード要素を抽出し、コードレビューと監査ワークフロー向けのセキュリティ重視レポートを作成するRust製CLIツールです。
このプロジェクトがあなたの仕事に役立っているなら、継続的なメンテナンスと新機能の開発を支援してください。
ETH 寄付ウォレット
0x11282eE5726B3370c8B480e321b3B2aA13686582
上記のQRコードをスキャンするか、ウォレットアドレスをコピーしてください。
Rust製CLIツール。Gitリポジトリを再帰的に検出し、状態変更をキャプチャ、差分を生成、コード要素を完全スニペット付きで抽出、コードレビューや監査ワークフロー向けのセキュリティ重視レポートを出力します。
なぜ単にbashを使わないのか?
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; doneのようなワンライナーは生の差分しか表示しません。 DiffCatcherは再帰的検出、コード要素抽出、セキュリティパターン検出、 CI/CD向けSARIF出力、並列処理、リポジトリ横断のセキュリティ集約を追加します。 詳細な比較は以下のbash比較を参照してください。
git clone https://github.com/Teycir/DiffCatcher.git
cd DiffCatcher
cargo build --release
./target/release/diffcatcher --help
# ディレクトリ内の全リポジトリをスキャン(fetchのみ、変更なし)
diffcatcher ~/projects
# プル更新してセキュリティレポートを生成
diffcatcher ~/projects --pull -o ./report
# 単一リポジトリ内の2つのブランチを差分(PRレビューモード)
diffcatcher ./my-repo --diff main..feature/auth -o ./pr-report
# GitHub Code Scanning向けSARIF出力を生成
diffcatcher ~/projects --summary-format sarif,json -o ./report
# ドライラン:何がスキャンされるか確認
diffcatcher ~/projects --dry-run
# 8並列ワーカーで高速スキャン
diffcatcher ~/projects -j 8 --quiet
# デフォルト設定でスキャン(fetchのみ)
diffcatcher <ROOT_DIR>
# カスタム出力ディレクトリ
diffcatcher ~/projects -o ./my-report
# ネストされたリポジトリを含め、シンボリックリンクを追跡
diffcatcher ~/projects --nested --follow-symlinks
# 隠しディレクトリをスキップ
diffcatcher ~/projects --skip-hidden
# Fetchのみ(デフォルト、ワーキングツリーは変更なし)
diffcatcher ~/projects
# 実際にプルを実行
diffcatcher ~/projects --pull
# ダーティリポジトリでstash/popを強制プル
diffcatcher ~/projects --pull --force-pull
# rebase戦略を使用
diffcatcher ~/projects --pull --pull-strategy rebase
# fetch/pullを完全にスキップ(過去差分のみ)
diffcatcher ~/projects --no-pull
# 要素抽出をスキップ(生の差分のみ)
diffcatcher ~/projects --no-summary-extraction
# 要素は抽出するがコードスニペットはスキップ
diffcatcher ~/projects --no-snippets
# スニペットのコンテキストと制限を調整
diffcatcher ~/projects --snippet-context 10 --max-snippet-lines 300
# 差分あたりの要素数を制限
diffcatcher ~/projects --max-elements 1000
# セキュリティタグ付けをスキップ
diffcatcher ~/projects --no-security-tags
# テストファイルもセキュリティ分析に含める
diffcatcher ~/projects --include-test-security
# カスタムセキュリティパターンを使用
diffcatcher ~/projects --security-tags-file ./custom-patterns.json
DiffCatcherはプロジェクトローカルの設定を自動読み込みします:
<ROOT_DIR>/.diffcatcher.toml (デフォルト)--config <FILE> でカスタムファイル--no-config で無効化例:
output = "reports-local"
no_pull = true
history_depth = 2
summary_formats = ["json", "txt"]
no_security_tags = false
[plugins]
security_pattern_files = ["plugins/security-extra.json"]
extractor_files = ["plugins/extractors.json"]
CLIフラグは明示的に設定された場合、設定値を上書きします。
DiffCatcherは2種類のプラグインをサポート:
--security-plugin-file <FILE> (繰り返し可)--extractor-plugin-file <FILE> (繰り返し可)セキュリティプラグインの形式は --security-tags-file JSON (version, mode, tags) と同様です。
抽出プラグインの形式:
{
"version": 1,
"extractors": [
{
"name": "policy-rule",
"kind": "Config",
"regex": "^policy\\s+([A-Za-z_][A-Za-z0-9_]*)"
}
]
}
# 単一リポジトリ内の2つのブランチを差分
diffcatcher ./my-repo --diff main..feature/auth
# 特定のコミットを差分
diffcatcher ./my-repo --diff abc123..def456
# CI統合用SARIF出力で差分
diffcatcher ./my-repo --diff origin/main..HEAD --summary-format sarif -o ./pr-report
--diff BASE..HEAD フラグはリポジトリ検出とfetch/pullをスキップし、直接2つの参照(ブランチ、タグ、またはコミットSHA)を差分し、結果に対して完全な抽出+セキュリティタグ付けパイプラインを実行します。
# 他の形式と一緒にSARIFを生成
diffcatcher ~/projects --summary-format sarif,json,md
# CI/CDアップロード用にSARIFのみ
diffcatcher ~/projects --summary-format sarif -o ./report
--summary-format に sarif が含まれている場合、レポートルートに results.sarif ファイルが書き込まれます。このファイルは SARIF 2.1.0 標準に従い、GitHub Code Scanning、VS Code SARIF Viewer、Azure DevOps、その他のSARIF互換ツールと統合できます。
# インクリメンタルモード(変更のないリポジトリをスキップ)
diffcatcher ~/projects --incremental -o ./report
# ブランチパターンでフィルタ
diffcatcher ~/projects --branch-filter "main"
# 履歴深度を調整
diffcatcher ~/projects --history-depth 5
# CI/CD用JSON出力
diffcatcher ~/projects --quiet --json > result.json
# 発見したパスの詳細出力
diffcatcher ~/projects --verbose
<report_dir>/
├── summary.json # 全体サマリー
├── summary.md # Markdownサマリー
├── results.sarif # SARIF 2.1.0出力 (--summary-format sarif 時)
├── security_overview.json # リポジトリ横断セキュリティ集約
├── security_overview.md
├── <repo-name>/
│ ├── status.json # リポジトリ状態
│ ├── pull_log.txt
│ └── diffs/
│ ├── diff_N_vs_N-1.patch # 生の統合差分
│ ├── changes_N_vs_N-1.txt # ファイルマニフェスト
│ ├── summary_N_vs_N-1.json # 要素抽出
│ ├── summary_N_vs_N-1.md
│ └── snippets/
│ ├── 001_validate_token_ADDED.rs
│ ├── 002_check_permissions_BEFORE.rs
│ ├── 002_check_permissions_AFTER.rs
│ └── 002_check_permissions.diff
└── ...
全オプションは diffcatcher --help を参照してください。
カスタムパターンを定義したJSONファイルを作成:
{
"version": 1,
"mode": "extend",
"tags": [
{
"tag": "pii-handling",
"description": "PIIデータ処理",
"severity": "High",
"patterns": ["ssn", "social_security", "passport"]
}
]
}
--security-tags-file ./patterns.json で使用。
src/
├── cli.rs # 引数解析
├── scanner.rs # リポジトリ検出
├── git/ # Git操作
│ ├── commands.rs # Gitラッパー
│ ├── state.rs # 状態キャプチャ
│ ├── diff.rs # 差分生成
│ └── file_retrieval.rs
├── extraction/ # 要素抽出
│ ├── parser.rs # 統合差分パーサー
│ ├── elements.rs # 要素検出
│ ├── snippets.rs # コードスニペット抽出
│ ├── boundary.rs # 括弧/インデント追跡
│ └── languages/ # 言語固有パターン
├── security/ # セキュリティタグ付け
│ ├── tagger.rs # パターンマッチング
│ ├── patterns.rs # 組み込みパターン
│ └── overview.rs # リポジトリ横断集約
└── report/ # レポート生成
├── writer.rs # ディレクトリ構造
├── json.rs # JSONシリアライズ
├── sarif.rs # SARIF 2.1.0出力
├── markdown.rs # Markdownフォーマット
└── snippet_writer.rs
シンプルなbashワンライナーで差分を表示できます:
ls | while read line; do git -C "$line" diff HEAD~1 HEAD || true; done
これは簡単な確認には有効ですが、DiffCatcherは以下のような高度な機能を追加します:
bashワンライナーは約100バイトです。DiffCatcherは完全なコード要素抽出を備えたセキュリティ重視の監査ツールです。
# 全テストを実行
cargo test
# 特定のテストスイートを実行
cargo test security_tagger
# 出力を表示して実行
cargo test -- --nocapture
テストカバレッジ:
# ベンチマークバイナリをコンパイル
cargo bench --no-run
# ベンチマークハーネスを実行
cargo bench --bench core_bench
ベンチマークソースは benches/core_bench.rs にあり、パーサー/抽出のスループットを追跡します。
GitHub Actionsワークフローが含まれています:
.github/workflows/ci.yml: フォーマットチェック、clippy、テスト、ベンチマークビルド.github/workflows/release.yml: タグベースのリリースパッケージングとGitHubリリース公開src/security/patterns.rs 参照)全モジュールに包括的なインラインドキュメントがあります。主要モジュール:
src/extraction/parser.rs - ハンク抽出付き統合差分パーサーsrc/extraction/elements.rs - 言語認識コード要素検出src/extraction/snippets.rs - 境界検出付き完全コードスニペット抽出src/security/tagger.rs - セキュリティパターンマッチングエンジンsrc/git/commands.rs - Git操作ラッパー完全なAPIドキュメントの生成:
cargo doc --open
#rust #git #security #code-review #diff-analysis #static-analysis #devops #cli-tool #audit #vulnerability-detection #code-quality #snippet-extraction #parallel-processing #security-scanning
貢献を歓迎します!以下の手順でお願いします:
cargo test が通ることを確認MITライセンス - 詳細はLICENSEファイルを参照
| フラグ | デフォルト | 説明 |
|---|
-o, --output | ./reports/<timestamp> | レポート出力ディレクトリ |
-j, --parallel | 4 | 同時リポジトリ処理数 |
-t, --timeout | 120 | Git操作のタイムアウト(秒) |
-d, --history-depth | 2 | 差分対象の過去コミット数 |
--snippet-context | 5 | 変更前後のコンテキスト行数 |
--max-snippet-lines | 200 | スニペットあたりの最大行数 |
--max-elements | 500 | 差分あたりの最大要素数 |
--diff | — | 単一リポジトリ内の2つの参照を差分 (BASE..HEAD) |
--summary-format | json,md | 出力形式: json, md, txt, sarif |
| 機能 | Bashワンライナー | DiffCatcher |
|---|
| 再帰的検出 | トップレベルのみ | ネストリポジトリ、シンボリックリンク、フィルタ |
| 状態追跡 | なし | コミットハッシュ、ダーティ検出、プルログ |
| コード理解 | 生差分のみ | 10以上の言語で関数/構造体/クラスを抽出 |
| コードスニペット | なし | コンテキストウィンドウ付きの完全なbefore/after |
| セキュリティ分析 | なし | 18の組み込みパターン(認証、暗号、秘密情報、SQLi、XSS) |
| 出力形式 | ターミナルのみ | JSON、Markdown、SARIF(GitHub Code Scanning) |
| リポジトリ横断ビュー | 個別リポジトリのみ | 全リポジトリの集約セキュリティレポート |
| パフォーマンス | 逐次 | 並列ワーカー、LRUキャッシュ、インクリメンタルモード |
| CI/CD統合 | なし | SARIFアップロード(GitHub/Azure DevOps) |
| エラーハンドリング | ` | |
| パス処理 | スペースで失敗 | すべてのパス名を正しく処理 |
| 履歴コンテキスト | 固定HEAD~1 | 設定可能な深度、状態追跡 |