プログラミング
Show HN: AIコードレビューアをキャンセルして、無料のローカル版を作成しました
Show HN: I canceled my AI code reviewer and wrote a free local one (github.com)
要約
このプロジェクトは、AIコードレビューアの代替として開発された、軽量でGit対応のPython用静的解析CLIツール「Avouch」を紹介しています。Avouchは、コミット対象の変更ファイルのみを対象とし、標準ライブラリのASTモジュールを使用してコードの構造的問題を検出します。ネットワーク接続やデーモンプロセスを必要とせず、ローカル環境で高速に動作するため、git pushの直前に実行してコード品質を向上させることを目的としています。
全文翻訳
avouchあなたが変更したPythonをレビューしてください、あなたが引き継いだPythonではありません。Avouchは、Python用の軽量でGit対応の静的解析CLIです。Gitに変更されるファイルが次のコミットでどのファイルになるかを尋ね、標準のastモジュールで変更された各.pyファイルを解析し、avouch.tomlで設定した制限に対して構造的な問題を報告します。デーモンなし。ネットワークなし。維持するパスリストなし。git pushの直前に実行し、フラグ付けされたものを修正してプッシュします。pip install avouchcd your-repoavouch目次なぜ存在するのかインストールクイックスタートJSON出力サイレントモードGitHub Actionsその他のCIシステム設定ルール仕組みリポジトリレイアウトルールの追加テストロードマップFAQ貢献ライセンスなぜ存在するのかレビューセットは差分であり、リポジトリではありません。Avouchは実行時にGitからレビューセットを計算します(git diff HEAD --name-only および未追跡ファイル)。すべての検出事項は、あなたがプッシュしようとしている作業に起因するものであり、あなたが引き継いだレガシーに起因するものではありません。メトリクスは正確です。パラメータ数、ネストの深さ、行範囲はASTから取得され、正規表現ではありません。メトリックを正確に計算できない場合、Avouchはそれを主張しません。エラーはデータです。読み込めないファイルまたは構文的に壊れたファイルは、レポートのエラーエントリになります。1つの壊れたファイルが決して他のファイルのレビューをキャンセルすることはありません。Avouchはレビューしますが、ゲートしません。終了コードは結果を示しますが(0クリーン、1違反検出、2 Avouchエラー)、強制はオプトインインターフェイスに属し、すべてのプッシュの前に実行するツールには属しません。実行時間は標準ライブラリです。3回のgitサブプロセス呼び出しとast/tomllib。維持するデーモンはなく、実行時間はリポジトリのサイズではなく、差分のサイズによって制限されます。インストールPython 3.10以上(ルールはast.Matchを使用、設定はtomllibを使用)およびPATHにGitが必要です。pip install avouchまたはソースから:git clone https://github.com/mukundzha/avouch.gitcd avouchpip install -e .どちらもavouchコンソールスクリプト(avouch.cli:main)を登録します。クイックスタートインターフェイスは、短いオプションフラグのセットを持つ1つのコマンドです:cd your-repo# ...変更を加える...avouch# 人間が読めるレポートavouch --json# 標準出力に1つのJSONドキュメントavouch --docs# 内蔵ドキュメント;レビューは実行されませんavouch --version# バージョンを表示して終了avouch --verbose# 標準エラー出力に段階的なレビュー詳細avouch --quiet# 分析し、レポートを表示しない;終了コードのみavouch --changed# HEADとの変更ファイルをコンパクトな追加/削除ビューで表示avouch --staged# 次のコミット用にステージングされたファイルのみをレビューavouch --all-files# 差分だけでなく、すべての対象Pythonファイルをレビューavouch --not-git# Gitリポジトリなしで、ディスク上のすべての対象.pyファイルをレビューavouch --help# すべてのフラグレビューセットはGitによって定義されるため、呼び出し時に設定する必要はありません。--not-gitを使用すると、AvouchはGitの要件をスキップし、現在のディレクトリをウォークして見つかったすべての対象.pyファイルをレビューします(Git、キャッシュ、仮想環境ディレクトリをスキップ)。Avouchは、HEADと比較して変更された追跡ファイル(git diff HEAD --name-only)と、未追跡の.pyファイルをレビューします(git ls-files --others --exclude-standard)。削除されたパスと.pyファイル以外のファイルはスキップされます。コミットされた、変更されていないファイルは決して出力に表示されません。生成されたように見えるファイル(generated.py、*_generated.py、codegen.py、autogen.py、… - src/avouch/utility/is_generated.pyを参照)もスキップされます。レビュー範囲フラグ--changed、--staged、および--all-filesは相互に排他的です - 最大1つを選択してください。出力フラグ--json、--verbose、および--quietは、任意のレビュー範囲と自由に組み合わされます。検出事項がある実行$ avouch AVOUCH · 2 FILES · 4 WARN ──────────────────────────────────────────────────────────────────────────────── bad.py:1: SCR002: Bare exceptが検出されました。代わりに特定の例外をキャッチしてください。例:except ValueError:。│ 1 │ def connect(host, port, user, password, db, timeout): │ ^^^^^^^ SCR002 2 │ try: │ bad.py:1: SCR014: パラメータが多すぎます(6/5)。関連パラメータをデータクラスまたは辞書にグループ化してください。│ 1 │ def connect(host, port, user, password, db, timeout): │ ^^^^^^^ SCR014 2 │ try: │ ──────────────────────────────────────────────────────────────────────────────── ルール別 SCR002 Bare except 1 SCR014 パラメータが多すぎます 1 ──────────────────────────────────────────────────────────────────────────────── PASSED ✓ src/util.py ヘッダー — AVOUCH · N FILES · W WARN · E ERR: ファイルと重大度ごとのカウント、それに続くファイルごとの検出事項。検出事項 — 各検出事項はコンパイラースタイルでレンダリングされます:ルールIDと完全なメッセージを含むファイル:行ヘッダー、次にコード領域と行番号を薄く表示し、フラグ付けされた名前の下にキャレット^^^^^を表示します(TTYではルールIDは青色)。ルール別サマリー — ルールごとに検出事項をカウントし、最も一般的なものから順に、カウントを右揃えにします。検出事項が存在する場合にのみレンダリングされます。合格グリッド — 準拠したファイルは数行に圧縮され、多数ある場合は[+N more]という注記が付いています。同一の(コンポーネント、ルール)検出事項はファイルごとに重複排除されます - ヘッダーはすべての検出事項をカウントするため、重複するルールID(SCR004 / SCR006 duplicate-branch)がある場合、行カウントはヘッダーカウントより少なくなる可能性があります。クリーンな実行$ avouch All clean.エッジケース$ cd /tmp/somewhere-without-git$ avouch error: no Git repository foundhint: run Avouch from inside a Git repository, or use --not-git to review files without Git$ cd ~/fresh-checkout # 例:CIランナー$ avouch error: nothing to reviewhint: nothing changed vs HEAD (CI checkouts are clean); use --all-files for a full review色は、標準出力がTTYの場合にのみ出力されるANSIコードです。パイプ出力はプレーンなので、avouch | tee review.log およびCIキャプチャはクリーンに機能します。実行時エラーは標準エラー出力に書き込まれるため、標準出力はパイプ処理や--jsonキャプチャのためにクリーンなままです。終了コードは、レビューがクリーンな場合は0、検出事項が報告された場合は1、Avouchが実行できない場合は2です。組み込みドキュメントavouch --docsは、このコードベースから派生したターミナルドキュメントを表示します - Avouchが何をするか、Git対応ワークフロー、スコープを持つすべてのルール、デフォルト値を持つすべての設定キー、両方の出力形式、および現実的な例 - その後、レビューを実行せずに終了します。Gitリポジトリの外でも、どこでも機能します。実際のターミナルではインタラクティブブラウザ(Help, Go, Main screen, Quit)として開きます。標準出力がパイプされている場合はプレーンテキストを表示します。JSON出力自動化およびCIのために、--jsonはレビューを標準出力に単一のJSONドキュメントとして出力します。人間が読めるテキストは混入しません:avouch --json { "version": 1, "tool": "avouch", "violations": [ { "rule": "SCR014", "severity": "WARNING", "message": "Too many parameters (6/5). Group related parameters into a data class or dictionary.", "file": "buggy.py", "name": "extra", "kind": "func", "line": 4 } ], "summary": { "total": 1, "errors": 0, "warnings": 1, "files_with_violations": 1 } } 各違反には、ルールID(または検出事項に名前がない場合は人間が読めるラベル)、重大度、メッセージ、ファイル、コンポーネント名、その種類(func、class、またはfile)、および検出事項が参照する行(ファイルレベルの検出事項の場合はnull)が含まれます - 人間が読めるテーブルと同じコンポーネントと種類です。files_with_violations は、少なくとも1つの違反を含む個別のファイルの数です。ドキュメントは、自動化のための安定したバージョン管理された契約です:version はスキーマバージョン(Avouchパッケージバージョンとは独立)、tool は発行者を識別し、同じ入力は常に同じJSONを生成します - 色、タイムスタンプ、または診断は漏れません。終了コードは通常モードとまったく同じように動作するため、avouch --json はCIをゲートできます:標準出力から検出事項を解析し、終了ステータス(0クリーン、1違反、2 Avouchエラー)に反応します。サイレントモード--quietはまったく同じ分析を実行しますが、レポートは出力しません。終了コードのみが結果を示します(0クリーン、1違反、2 Avouchエラー)。これは、ステータスのみを必要とするフックやスクリプトに適しています。エラーは決してサイレントにはなりません:「error: no Git repository found」のようなメッセージは依然として出力され、--jsonはドキュメントをエミットし、--verbose診断は標準エラー出力に送信されます。GitHub ActionsAvouchは、すべてのプルリクエストでGitHub Actionsのチェックとして実行できます。