adk-verify-snippets について
adk-verify-snippetsは、Markdownファイル内のPythonコードブロックを検証するスキルです。各スニペットを個別のサブプロセスで実行し、読み込み・実行結果とカバレッジを含むレポートを作成します。
主な機能
- 01フェンス付きPythonスニペットの抽出
- 02各スニペットを個別のサブプロセスで実行
- 03読み込みと実行状況の報告
- 04スニペットごとの行カバレッジ
- 05リポジトリ内のファイルを変更しない
活用シーン
- 01ドキュメント内の実行可能なコードの確認
- 02スニペットの失敗とカバレッジの確認
- 03Markdownの例を変更せずに検証
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ google/ adk-python --skill adk-verify-snippetsインストール後、Claude Code で/adk-verify-snippetsを入力して読み込まれたか確認します。
同梱ファイルscripts/run.pyscripts/verify_md.py
詳細
Markdown スニペットを検証する
Markdown ファイルからすべての ```python ブロックを抽出し、同梱の run.py ハーネスを介してそれぞれを個別のサブプロセスで実行し、各スニペットの読み込み状況、実行状況、行カバレッジをまとめたレポートを書き出します。
読み取り専用の取り決め
ドキュメントの検証によって、ドキュメントが変更されることがあってはなりません。検証対象の Markdown、そのコードブロック、SKILL.md を含め、リポジトリ内のファイルを作成、変更、削除しないでください。失敗を報告し、修正したりパッチを提示したりしないでください。
スクリプトが行う書き込みは次の2つだけです。一時的な .py ファイルをリポジトリ外のシステム一時ディレクトリに作成します(終了時に削除されます)。もう1つは、ソースの Markdown ファイルと同じ場所にレポートを書き出します。
前提条件
-
ADK 開発環境が必要です。リポジトリのルートから
uv仮想環境を有効にして実行してください(adk-setupスキルを参照)。 -
coverageは任意です。プロジェクトの依存関係として宣言されていないため、明示的にインストールしてください。インストールされていない場合、Coverage 列には—が表示されます。uv pip install coverage -
Gemini API キーが必要です。ただし、
Agent、App、Workflowを構築するスニペットに限ります。これらは実際の API を使用して実行されます。export GEMINI_API_KEY="{your_key}" # or export GOOGLE_API_KEY="{your_key}"両方が設定されている場合、ハーネスは
GOOGLE_API_KEYを破棄するため、GEMINI_API_KEYが優先されます。
使い方
uv run --no-sync python .agents/skills/adk-verify-snippets/scripts/verify_md.py {path_to_markdown_file}
スクリプトはスニペットごとの進行状況を表示してから、ソースファイルと同じ場所にレポートを書き出し、その完全なパスを表示します。
レポートのファイル名は、ソースファイルの拡張子を除いた名前を小文字に変換し、[a-z0-9_] 以外の文字をすべて削除したものに _REPORT.md を付けたものです。したがって、Workflow-Guide.md の場合、Workflow-Guide_REPORT.md ではなく workflowguide_REPORT.md が生成されます。自分でパスを組み立てるのではなく、スクリプトが表示するパスを確認してください。
レポートには、スニペットごとに1行を含む Executive Summary テーブルがあり、続いて各スニペットの詳細セクションが含まれます。詳細セクションには、コードブロック、実行ログ(標準出力と標準エラー/トレースバック)、カバレッジの出力が記載されます。
各スニペットの分類方法
実行可能 — モジュールレベルの ADK コンポーネントがある
スニペットが Workflow、Agent、App のいずれかをモジュールレベル変数に割り当てている場合、ハーネスは Gemini API を使用して実行します。
- 変数名は関係ありません。ハーネスは
vars(module)をスキャンします。 - 優先順位は
Workflow、ルートAgent、Appの順です。スニペット内のどこかにWorkflowがあれば、どのエージェントよりも優先されます。 - ルートエージェントは、ほかのエージェントの
sub_agentsに含まれていない、最初に見つかったエージェントです。そのため、複数のエージェントを含むスニペットは、エージェントの定義順にかかわらず正しく解決されます。 Appはroot_agentを指定して構築されている必要があります。指定されていない場合、実行は失敗します。- 送信されるプロンプトは
"Test input topic"です。スニペット内でモジュールレベルのtest_input文字列を定義すると、上書きできます。
読み込みのみ — ADK コンポーネントがない
ハーネスはスニペットの構文とインポートを確認し、API 呼び出しは行いません。レポートには ➖ NO ADK COMPONENT と表示されます。
スキップ — ignore が指定されている
ブロックを除外するには、開始の ```python フェンスの直前の行に `` を単独で記述します。擬似コード、説明用の断片、外部のセットアップが必要なスニペットに使用してください。レポートには ⏭️ SKIPPED と表示されます。
```python
# pseudo-code — not runnable as-is
my_agent = Agent(model="gemini-ultra-hypothetical", ...)
```
正しいスニペットが壊れていると報告される原因となる制限事項
これらを回避するため、ドキュメントを編集するのではなく、`` で注釈を付けてください。
- スニペット間で状態は共有されません。 各スニペットは新しいサブプロセスで実行されるため、前のブロックでインポートしたものや定義した変数に依存するスニペットは、
NameErrorまたはImportErrorで失敗します。 - スニペットごとに120秒のタイムアウトがあります。 タイムアウト後にプロセスが強制終了され、スニペットは実行失敗として報告されます。
- 注釈の配置。 注釈は次の
```pythonフェンスに適用されます。間に空行があっても問題ありませんが、文章や見出しがあると適用されません。 - 単独の
```はブロックを閉じます。 パーサーは言語タグのない最初のフェンスで Python ブロックを閉じるため、スニペット内のコンテンツとして使われた単独のフェンスがあると、そこで切り詰められます。タグ付きのフェンス(たとえば```bash)はリテラルなコンテンツとして保持されるため、安全です。 - モジュールレベルの
asyncio.run()はハーネス独自のイベントループと競合し、実行失敗として報告されます。スニペットでは、トップレベルの非同期呼び出しをif __name__ == "__main__":の後ろに置いてください。
ユーザーへの報告
生成されたレポートを読み、エグゼクティブサマリーの表を記載どおりにそのままコピーしてください。6列、同じ順序で、列名の変更や削除はしないでください。
Snippet | Preceding Heading | Load Phase | Run Phase | Coverage | Details
表を提示したら、そこで終了してください。