mcpField
O
oh-precommit-codecheck

oh-precommit-codecheck

github.com/openharmonyinsightテスト・品質3562 回インストール11 週間前に更新
リポジトリ

oh-precommit-codecheck について

OH Precommit Codecheck は、OpenHarmony への提出前にローカルで品質チェックを行うスキルです。ゲートチェックの一部に加え、Python、Shell、GN の検査も実行しますが、ローカルでの合格はゲート通過を保証しません。

主な機能

  1. 01著作権ヘッダーと年の確認
  2. 02clang-format による C/C++ 整形
  3. 03CodeArts Check による C/C++ 解析
  4. 04Python、Shell、GN のローカル検査
  5. 05欠陥報告と回数制限付き自動修正

活用シーン

  1. 01提出前の OpenHarmony 変更の確認
  2. 02C/C++ ファイルの整形と解析
  3. 03Python、Shell、GN のローカル検査
  4. 04自動対応可能な問題の修正

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/openharmonyinsight/openharmony-skills --skill oh-precommit-codecheck

インストール後、Claude Code で/oh-precommit-codecheckを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.zh-CN.md
scripts/
check_copyright.sh
check_python.sh
check_shell.sh
check.sh
setup.sh

詳細

OH Precommit Codecheck

ローカルでコード品質チェックを実行します。CI のゲートチェックと、ローカルのみの追加チェックが含まれます。

CI ゲートチェック(OpenHarmony のゲートと同じ):

  • 著作権:ヘッダーの有無、年の正確性、コメントスタイル(C/C++ では /**)
  • C/C++ フォーマット:clang-format(clang-format-14 を優先し、なければ clang-format)
  • C/C++ 品質:CodeArts Check(codecheck-ide-engine + Huawei clang-tidy:clangtidy + secfinder + fixbot)

ローカルの追加チェック(CI ゲートの対象外。品質向上のためのチェック):

  • Python:pylint + flake8
  • Shell:shellcheck + bashate-mod-ds
  • GN:gn format --dry-run

注意事項

  • 初回実行時に、CodeArts ツールを ~/.codecheck-tools/ に約 600MB ダウンロードします
  • Python/Shell リンターは事前にインストールする必要があります(pylint、flake8、shellcheck、bashate-mod-ds)
  • compile_commands.json がない場合、C/C++ チェックでコンテキストに依存する問題を検出できないことがあります
  • GN フォーマットチェックには、PATH に gn が必要です

現在の制限事項

このスキルでカバーするのは、OpenHarmony の CI ゲートチェック全体の一部です。

  • 言語:チェック対象は C/C++、Python、Shell、GN のみです。Java、JavaScript、TypeScript、ArkTS はまだ組み込まれていません(CodeArts エンジンには、それらのルールがローカルにあります)。
  • C++ ルール:ゲートの G.* ルール約 163 件のうち、約 114 件(約 70%)をカバーしています。不足しているルールは主に、-CPP 接尾辞のない C 言語用のルールです。
  • まったくカバーしていない項目:WordsTool の機密語チェック(200 件以上のルール)、OAT のオープンソースコンプライアンス(約 10 件のルール)、セキュリティ固有のチェック(脆弱な暗号、危険な IPSI)、コードメトリクス(過大な関数/ファイル/複雑度、冗長コード/重複コード)。
  • ローカルでの合格は、ゲートの合格を保証しません。これはベストエフォートの事前フィルターです。

クイックリファレンス

呼び出しモード動作
/oh-precommit-codecheck(単独)モード 1指定されたファイルをチェックし、結果を報告してから、修正するか確認します
/oh-precommit-codecheck --fixモード 1チェックし、最大 3 ラウンドまで自動修正します
oh-pr-workflow による自動起動モード 2サイレントチェックと自動修正を行い、欠陥が残った場合のみ報告します
プリコミットフックモード 2自動起動と同じです

トリガーモードの判定

$ARGUMENTS が設定されているか確認します。

モード 1:ユーザーによる呼び出し($ARGUMENTS が設定されている場合、または /oh-precommit-codecheck が呼び出された場合)

$ARGUMENTS を解析して、対象ファイルと修正モードを決定します。

/oh-precommit-codecheck              → files from: git diff --cached --name-only
/oh-precommit-codecheck <commit>     → files from: git diff-tree --no-commit-id -r <commit> --name-only
/oh-precommit-codecheck <file ...>   → the listed files directly
/oh-precommit-codecheck --fix        → same file resolution + auto-fix mode

引数の解析ルール:

  • --fix フラグは引数内のどこにあってもかまいません
  • 引数が Git コミットのように見える場合(git rev-parse --verify <arg> に一致する場合)は、コミットとして扱います
  • それ以外はファイルパスとして扱います

手順:

  1. 上記のルールに従ってファイルリストを解決します。存在するファイルのみを対象にします。
  2. チェックスクリプトを呼び出してチェックを実行します。
    bash ~/.claude/skills/oh-precommit-codecheck/scripts/check.sh <file1> <file2> ...
    
  3. 簡潔なサマリーテーブルで結果をユーザーに提示します。
  4. 欠陥が見つかり、--fix が指定されていない場合:
    • 次のように提案します:「/oh-precommit-codecheck --fix を実行して、これらの問題を自動修正してください。」
  5. --fix が指定され、欠陥が見つかった場合:
    • 著作権の欠陥:著作権ヘッダーを直接修正します(不足しているヘッダーの追加、年の更新、コメントスタイルの変更)。
    • C/C++ の欠陥:欠陥のあるファイルをそれぞれ読み、ルール違反の内容を把握して、Edit ツールを使用して直接修正します。
    • Python の欠陥:欠陥のあるファイルをそれぞれ読み、ルール違反の内容を把握して、Edit ツールを使用して直接修正します。
    • Shell の欠陥:欠陥のあるファイルをそれぞれ読み、ルール違反の内容を把握して、Edit ツールを使用して直接修正します。
    • GN フォーマットの欠陥:gn format <file> を実行して自動フォーマットします。
    • 修正後、チェックを再実行して検証します。最大 3 ラウンドまで繰り返します。
    • 修正できない欠陥が残っている場合は報告します。
モード 2:AI による自動トリガー($ARGUMENTS なし、コード変更の完了後)

コードファイルの作成または変更を終えたら、自動的にチェックします。

手順:

  1. この会話で変更したファイルの一覧を収集します(ツール呼び出し履歴から、Edit/Write の呼び出しを確認します)。
  2. チェックを実行します:
    bash ~/.claude/skills/oh-precommit-codecheck/scripts/check.sh <modified_files...>
    
  3. 欠陥が 0 件の場合:何も言わずに終了します。ユーザーに求められない限り、チェックについて伝えないでください。
  4. 欠陥が見つかった場合: a. 各欠陥を自動修正します:
    • 著作権:著作権ヘッダーを追加または更新します。
    • C/C++ の機械的な修正(G.FMT.11-CPP の波括弧、G.EXP.35-CPP の nullptr、G.FMT.05-CPP の行幅):直接修正します。
    • C/C++ の判断が必要な修正(G.NAM.03-CPP の命名、G.FUN.01-CPP のサイズ):自動修正せず、ユーザーに報告します。
    • Python / Shell:標準的なルールに従って直接修正し、曖昧なものは報告します。
    • GN のフォーマット:gn format <file> を実行します。 b. チェックを再実行して、修正を確認します。 c. 合計 3 ラウンドまで繰り返します。 d. 3 ラウンド後も欠陥が残る場合は、修正できないものをユーザーに報告します。

モード 2 と CLAUDE.md の連携:pre-commit フックまたは oh-pr-workflow によって起動された場合、モード 2 はコミット作業を円滑に進めるために自動修正します。ユーザーはすでにコミットする意図を示しているため、これは CLAUDE.md の「先にレポートを提示する」という慣例より優先されます。単独で起動された場合(コミットの文脈なしで /oh-precommit-codecheck を実行した場合)は、デフォルトでレポートのみを提示し、修正してよいか確認します。


以下:参考セクション — 特定の種類の欠陥を修正するときに参照してください。 ガードレールだけが必要な場合は、「よくある間違い」に進んでください。

修正ガイドライン

欠陥を自動修正するときは、該当するルールに沿って以下の修正を行います。ルールが一覧にない場合は、欠陥メッセージを読み、最善の判断で対応してください。

著作権
  • no-copyright:Apache 2.0 の完全な著作権ヘッダーを追加します(テンプレートは CLAUDE.md を参照してください)。
  • wrong-year:現在の年を含むように年の範囲を更新します(例:2025 → 2025-2026)。
  • wrong-comment-style:.cpp/.c/.h/.hpp ファイルの場合、1 行目を /** に変更します(ブロックコメント形式)。
C/C++(CodeArts)
  • G.FMT.11-CPP(波括弧):1 行の if/for/while/else 本体を {} で囲みます。
  • G.NAM.03-CPP(命名):変数名や関数名を規約に合わせて修正します。
  • G.EXP.35-CPP(nullptr):ポインターの文脈で NULL / 0 を使用している場合は nullptr に置き換えます。
  • G.FUN.01-CPP(パラメーター):自動修正できないため、ユーザーに報告します。
  • G.CNS.02-CPP(マジックナンバー):名前付きの constexpr 定数に切り出します。
Python
  • C0304(最終行の改行):末尾に改行を追加します。
  • C0305(末尾の改行):余分な末尾の空行を削除します。
  • C0321(複数の文):個別の行に分割します。
  • C0410(複数のインポート):1 行につき 1 つのインポートにします。
  • その他の pylint/flake8 ルール:メッセージを読み、適切に修正します。
Shell
  • SC2086(ダブルクォート):変数展開をダブルクォートで囲みます。
  • SC2164(cd の失敗):cd コマンドの後に || exit を追加します。
  • SC2148(シバン):先頭に #!/usr/bin/env bash を追加します。
  • その他の shellcheck ルール:メッセージを読み、適切に修正します。
GN
  • gn format <file> を実行します。完全に自動で処理され、手動での介入は不要です。

よくある間違い — 絶対にしないでください

  • gn parseに失敗するファイルに対して、絶対にgn formatを実行しないでください — ファイルが破損します。まずgn parseを実行してください。失敗した場合は、フォーマットする前に手動で構文を修正してください。
  • G.FUN.01-CPP(関数が長すぎる)を絶対に自動修正しないでください — アーキテクチャ上の判断が必要です。必ずユーザーに報告してください。
  • 周辺のコードを読まずにG.NAM.03-CPPの命名を絶対に自動修正しないでください — 命名規則はコンテキストによって異なります(メンバー変数、グローバル変数、関数のパラメーターでは規則が異なります)。
  • エンジンログに起動エラーがある場合、CodeArtsで欠陥数が0でも絶対に信用しないでください — defects.jsonが空でないこと、およびエンジンが正常に終了したことを確認してください。
  • ローカルのツールバージョンがゲートCIと一致すると絶対に思い込まないでください — バージョンの不一致は誤検出の原因になります。結果がゲートと異なる場合は、java -version、clang-tidy --version、pylint --versionを確認してください。
  • チェッカーが1つだけ失敗した場合、チェック一式を絶対に再実行しないでください — 時間を節約するため、失敗したチェッカーだけを再実行してください。

エラーからの復旧

  • CodeArtsエンジンが起動しない:java -versionを確認してください(11以降が必要です)。ダウンロードの整合性を確認してください:md5sum codecheck-ide-engine.jar。セットアップを再実行してください:bash scripts/setup_codecheck.sh --force。
  • compile_commands.jsonが見つからない:C++チェックの誤検出率は約30%になります。次のコマンドで生成するか、精度が低下することを承知のうえで続行してください:gn gen out/default --export-compile-commands。
  • pylint/flake8のバージョン不一致:ゲートでは特定のバージョンを使用します。pylint --versionで確認し、ゲートCIのログと比較してください。

出力例

モード1の一般的な結果:

Codecheck Results (12 defects):
| Rule | Count | File | Auto-fixable |
|------|-------|------|-------------|
| G.FMT.11-CPP | 5 | token_test.cpp | Yes |
| G.NAM.03-CPP | 3 | token_test.cpp | Yes (with context) |
| G.EXP.35-CPP | 2 | token_test.cpp | Yes |
| G.FUN.01-CPP | 1 | token_test.cpp | No — report to user |
| G.FMT.05-CPP | 1 | token_test.cpp | Yes |

发现 12 个告警,其中 11 个可自动修复。是否修复?

コメント