ui-context について
ui-contextは、IDAの現在の画面状態を取得して解釈するidasqlスキルです。ビュー、選択範囲、コード位置を報告し、取得できない情報を推測しないようエージェントを導きます。
主な機能
- 01現在の画面状態を取得
- 02ビューの種類とタイトルを特定
- 03選択範囲とプレビューを報告
- 04コードのアドレス位置を抽出
- 05UIを利用できない実行環境に対応
活用シーン
- 01IDAの表示内容を説明
- 02現在の選択範囲を説明
- 03表示中のビューから関数を特定して解説
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ allthingsida/ idasql-skills --skill ui-contextインストール後、Claude Code で/ui-contextを入力して読み込まれたか確認します。
同梱ファイルagents/openai.yaml
詳細
主なクエリ
アクティブな UI の状態を取得するには、この関数を使用します。
SELECT get_ui_context_json();
ユーザーの質問ごとに一度取得し、回答中はそのスナップショットを再利用します。 ユーザーが更新や再確認を求めた場合、または UI に関する新しい質問が始まった場合にのみ、再取得します。
トリガーパターン
次のようなプロンプトで、このスキルを使用します。
- 「今何を見ていますか?」
- 「画面に何が表示されていますか?」
- 「何が選択されていますか?」
- 「今していることを見て」
- 「これ」「ここ」「現在」「選択中」「あれ」「前のもの」などの参照
取得ポリシー
- UI に関するプロンプトに回答する前に、
get_ui_context_json()を呼び出します。 - ビュー情報(ウィジェットの種類/タイトルとカスタムビューの状態)を抽出します。
- 選択情報がある場合は、開始位置/終了位置とプレビューのテキスト行を抽出します。
- コードアンカー情報がある場合は、アドレス、関数、セグメントを抽出します。
has_address: falseの場合は制限を説明し、コードコンテキストを捏造しないでください。
ウィジェットフィールド(focused_widget / main_viewer)
type_id(int):生の IDAtwidget_type_t数値 ID です。type_name(string):ビルドに使用された SDK のウィジェットの SDK マクロ名です(例:"BWN_PSEUDOCODE"、"BWN_TILIST")。SDK スロット 10 の名前は IDA のバージョンによって異なります(BWN_TILVIEW/BWN_TICSR/BWN_TITREE)。canonical_name(string):バージョンをまたいで安定した名前です。「Local Types」ウィジェット(スロット 10)の場合は常に"BWN_LOCAL_TYPES"となり、その他のウィジェットではtype_nameと同じです。バージョンをまたいだ推論には、こちらを優先してください。category(string):大まかな分類です。disassembly、decompiler、hex_view、type_view、chooser、debugger、navigation、output、script、auxiliary、unknownのいずれかです。is_address(bool):ウィジェットが意味のあるアドレスアンカーを公開するかどうかを示します(DISASM、HEXVIEW、PSEUDOCODE、MICROCODE では true)。is_custom_view(bool):カスタムの行コンテンツを持つビューア形式のウィジェットかどうかを示します。is_chooser_like(bool):行ベースのリスト/選択ウィジェットで、行の選択に意味があるかどうかを示します。title(string):IDA が報告するウィジェットのタイトルです。
main_viewer には同じウィジェットフィールドが含まれますが、is_chooser_like は含まれません(メインビューアは常にビューアであり、選択ウィジェットではありません)。
時間的参照のルール
this/here/current/selected:この質問のために新しいスナップショットを取得します。that/previous/earlier:同じ作業フロー内の直近のスナップショットを再利用します。- ユーザーが「更新」と言った場合は、直ちに新しいスナップショットを取得します。
実行環境での利用可否とフォールバック
get_ui_context_json()はすべての実行環境に登録されていますが、ライブ UI の状態を返すのは IDA GUI プラグインのみです。- ライブ GUI のエンベロープには
available:trueが含まれます。idalib/CLI のスタブにはavailable:falseとcapture.source:"cli"が含まれます(エラーではなく、UI がないだけです)。そのため、availableは GUI と CLI を双方向で確実に判別できる値です。これを基準にしてください。 - CLI のスタブを受け取った場合は、そのことを明確に伝え、UI を必要としないクエリ(明示的なアドレス/シンボル、またはデータベースの状況確認クエリ)に進みます。
binary はデータベースのメタデータにすぎず、UI コンテキストの代わりにはなりません。
回答テンプレート
UI コンテキストを読み取った後は、次の固定形式を使用します。
What You Are Viewing:ウィジェット/ビューの概要。What Is Selected:選択範囲とプレビュー(または「アクティブな選択なし」)。Code Context:利用可能な場合はアドレス/関数/セグメント。そうでない場合は、アドレスを持たないビューであることを記載します。Limits:確度に影響する実行環境の制約や不足フィールド。Suggested Next Query:具体的な次のコマンド/クエリを1つ提示します。
例
1) 「今何を見ていますか?」
SELECT get_ui_context_json();
上記のテンプレート項目を使って回答します。フォーカスされたウィジェットのタイトル/種類と、存在する場合は現在のアンカーアドレスを含めます。
2) 「今していることを見て」
SELECT get_ui_context_json();
まずアクティブなビューと選択内容を要約し、そのコンテキストに沿った次のアクション(例:現在の関数をデコンパイルする)を提案します。
3) 「今何が選択されていますか?」
SELECT get_ui_context_json();
選択範囲の開始位置/終了位置とプレビューテキストを優先します。アクティブな選択がない場合は、その旨を明示します。
4) 「この関数について説明して」
- UI コンテキストを取得します。
- 関数/アドレスのコンテキストがある場合は、逆コンパイラーに切り替えます。
SELECT get_ui_context_json();
SELECT decompile(0x401000);
0x401000 を、取得した関数/アドレスのアンカーに置き換えます。
5) 続けて質問:「あの関数はどうですか?」
同じフローの最新のスナップショットを再利用し(求められない限り自動更新は行わず)、保存済みのアンカーから分析を続けます。
6) アドレス以外のビュー(Local Types の選択画面など)
SELECT get_ui_context_json();
has_address: false の場合は、選択画面の詳細を報告し、このビューにはコードアドレスのアンカーがないことを伝えます。
7) プラグイン API を利用できない場合(CLI/idalib)
get_ui_context_json() を実行できない場合は、次のようにします。
- このランタイムでは UI コンテキストを利用できないことを伝えます
- シンボル/アドレスを明示するよう依頼するか、UI を使わない方法で続行します(例:DB の概要を確認するための
SELECT * FROM binary)
ガードレール
binaryの出力を UI コンテキストとして扱わないでください。- 存在しない選択/アドレスのフィールドを捏造しないでください。
- ユーザーから更新を求められない限り、1 回の回答でコンテキストを繰り返し取得しないでください。