mcpField
A
ast-grep

ast-grep

github.com/wilbeibi開発237 回インストール3 日前に更新
リポジトリ

ast-grep について

ast-grep は、自然言語のコード検索要求を ast-grep ルールに変換するスキルです。サンプルで検証してからコードベースで実行し、ルールの作成やデバッグを進められます。

主な機能

  1. 01検索要求を ast-grep ルールに変換
  2. 02サンプルコードでルールをテスト
  3. 03パターンやルールでコード検索
  4. 04構文と AST マッチをデバッグ

活用シーン

  1. 01指定した構造のコードを検索
  2. 02リレーショナルルールの作成と調整
  3. 03ルール不一致時に AST ノードを確認

インストール

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

$npx skills add https://github.com/wilbeibi/wilbeibi-skills --skill ast-grep

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

同梱ファイルreferences/rule_reference.md

詳細

ast-grep コード検索

自然言語のクエリを ast-grep ルールに変換し、サンプルに対して検証してから、コードベースで実行します。ルール構文の全容(アトミック/リレーショナル/複合ルール、メタ変数、トラブルシューティング、実例)はreferences/rule_reference.mdに記載されています。単純な pattern を超えるものを書く場合は、こちらをお読みください。

前提条件

ast-grep --version が動作する必要があります。インストールされていない場合は、brew install ast-grep(macOS)、npm i -g @ast-grep/cli、または cargo install ast-grep を実行してください。ast-grep を使用してください(sg エイリアスはシステムの sg と競合します)。

ワークフロー

  1. 明確化 — 言語は何ですか?一致させる正確な構造は何ですか?含める/除外するエッジケースはありますか?
  2. サンプルを作成 — 一致するはずの小さなコード片を書き、一時ファイルに保存します。
  3. ルールを作成 — まずは動作する最も単純なものから始め、段階的に複雑にします。
    • 直接的なコード構造には pattern → ノードタイプには kind → リレーショナル(has/inside)→ 複合(all/any/not)。
    • **リレーショナルルールには必ず stopBy: end を追加してください。**これにより、最初に一致しないノードで停止せず、サブツリー全体を走査します。
  4. サンプルに対してテストし、一致するまで調整します(下記のデバッグを参照)。
  5. 一致するようになったら、コードベースで実行します。

コマンド

目的コマンド
単純なパターン検索ast-grep run --pattern 'console.log($ARG)' --lang js .
ルールファイルを使った検索ast-grep scan --rule rule.yml /path
ファイルを使わないインラインルールast-grep scan --inline-rules "$YAML" /path
スニペットに対してルールをテストecho '<code>' | ast-grep scan --inline-rules "$YAML" --stdin
kind の値を調べるために AST を確認ast-grep run --pattern '<code>' --lang js --debug-query=cst

構造化された出力を得るには、上記のいずれかに --json を追加します。--debug-query は cst(すべてのノード)、ast(名前付きノードのみ)、または pattern(ast-grep がパターンをどのように読み取るか)を受け付けます。

単一ノードへの単純な一致には run --pattern を使い、リレーショナルまたは複合ロジックが必要な場合は scan(ルールファイルまたはインライン)を使います。

インラインルールでのエスケープ

シェルは $ を展開するため、二重引用符で囲んだ --inline-rules では \$VAR と記述するか、YAML を一重引用符で囲みます。

ast-grep scan --inline-rules "rule: {pattern: 'console.log(\$ARG)'}" .
ast-grep scan --inline-rules 'rule: {pattern: "console.log($ARG)"}' .

一致しないルールのデバッグ

  1. 単純化する — サブルールを、失敗している最小の部分まで削ります。
  2. リレーショナルルールに stopBy: end があることを確認します。
  3. --debug-query=cst を使って実際のノード構造を読み取り、kind の値を確認します。
  4. メタ変数が検出されていることを確認します(リファレンスのメタ変数に関する注記を参照)。

リソース

コメント