1. はじめに
バイブ コーディング(AI エージェントを使用して自然言語プロンプトからコードを記述する)により、デベロッパーの役割は作成者からオーケストレーターとレビュー担当者に変わります。完璧なコンテキストを準備し、AI エージェントがすべてのことを行ってくれると信頼しています。仕様書の作成から、コードがすべての要件を満たしていることの確認まで、さまざまな作業を AI エージェントに任せることができます。リスク: 迅速なイテレーション サイクルでは、機能コードが徹底的なセキュリティ レビューなしで承認される。最新のエージェントはデフォルトで安全なコードを生成することが多いですが、「多い」は「常に」ではありません。また、蓄積された脆弱性は手動レビューをすり抜けます。
この Codelab では、Antigravity をレビュー担当者として使用する 2 つのアプローチを説明することで、これらの問題に対処します。1 つは、CLI を使用した開発中のインタラクティブなアプローチ(レビュー、修正、PR)です。もう 1 つは、SDK を使用した継続的インテグレーションでの自動アプローチ(エージェントがすべての Pull Request をレビューし、結果をコメントとして投稿)です。
学習内容
リード CRM アプリをバイブコードで作成しました。AI エージェントが、Express バックエンド、SQLite データベース、React フロントエンドのフルスタックを構築しました。動作する。その後、エージェントに、見込み顧客の検索機能と管理者統計情報を使用した一括インポート/エクスポートという 2 つの新機能を追加するよう依頼しました。エージェントは両方を迅速に提供しました。コードが実行され、機能が動作し、PR が準備完了になります。
しかし、このコードは自分で書いたものではありません。承認しました。検索エンドポイントが SQL インジェクションに対して脆弱でないことをどのように確認しますか?管理ルートにハードコードされたパスワードがないことをどのように確認できますか?AI が生成したコードのすべての行を読んでいると、バイブコードの本来のメリットであるスピードが損なわれてしまいます。
この Codelab では、この問題を解決する 2 つの方法を紹介します。
- ケース 1 - インタラクティブ レビュー: 脆弱性のある機能ブランチをチェックアウトし、エージェント スキルで強化された Antigravity CLI を使用して差分をレビューし、問題を修正してクリーンな PR を作成します。
- ケース 2 - 自動システムによる審査: Antigravity SDK を搭載した GitHub アクションを設定して、PR を自動的にレビューし、構造化された検出結果をコメントとして投稿し、デベロッパーがレビューに関するフォローアップの質問をしたときに回答します。

学習内容
- バイブ コーディングがセキュリティ リスクを生み出す可能性がある理由と、自動システムによる審査が手動レビューで見逃されたものを検出する理由
- コミュニティで管理されているエージェント スキルをインストールして使用し、Antigravity CLI に高度なセキュリティとコードレビューの専門知識を提供する方法
- CLI をインタラクティブに使用して、機能ブランチの差分を確認し、脆弱性を修正して、クリーンな PR を作成する方法
- Antigravity SDK を使用して、宣言型の安全性ポリシーとライフサイクル フックを備えた読み取り専用のコードレビュー エージェントを構築する方法
- レビュー エージェントを GitHub アクションとしてデプロイし、PR をレビューして結果を PR コメントとして投稿する方法
前提条件
- Google Cloud アカウント
- GitHub アカウント
- ターミナル、バージョン管理、CI/CD に関する基本的な知識
2. 環境設定
このステップでは、Leads CRM アプリのリポジトリをフォークし、Cloud Shell にクローンを作成し、Antigravity CLI を設定して認証します。
リポジトリをフォークする
GitHub Actions で commit を push して PR を作成するため、リポジトリの独自のコピーが必要です。
次のリポジトリに移動します。
[フォーク] をクリックします。フォーク作成ページで、[main ブランチのみをコピー] チェックボックスをオフにします。フォークには他の機能ブランチ(feature/lead-search と feature/bulk-operations)を含める必要があります。


Cloud Shell を開く
ブラウザで Cloud Shell を開きます。Cloud Shell には、この Codelab で必要なすべてのツールがプリインストールされた環境が用意されています。プロンプトが表示されたら、[Authorize] をクリックします。
[表示] -> [ターミナル] をクリックしてターミナルを開きます。インターフェースは次のようになります。

これがメイン インターフェースになります。上部に IDE、下部にターミナルが表示されます。
GitHub で認証する
デフォルトでは、Cloud Shell に GitHub 認証情報は構成されていませんが、gh CLI はすでにインストールされています。後で commit を push して PR を作成できるように、認証を設定します。
gh auth login

「Github.com」を選択する

HTTPS を選択します(他のメカニズムに慣れている場合は、そちらを選択してもかまいません)。

[Y] を選択します。

次に、Login with a web browser を選択します。
**:**ブラウザでログインページを開くと、ワンタイム コードをコピーして入力するように求められます。ターミナルの URL で Ctrl + Click をクリックして、https://github.com/login/device URL を開くことができます。ログインするアカウントを選択し、コードを入力するよう求められます。

その後、Cloud Shell コンソール ページに戻ると、次のようなターミナル出力が表示されます。
✓ Authentication complete. - gh config set -h github.com git_protocol https ✓ Configured git protocol ! Authentication credentials saved in plain text ✓ Logged in as alphinside-joonix
これは、Cloud Shell で Github アカウントの認証が正常に設定されたことを意味します。
フォークされたリポジトリのクローンを作成する
次に、フォークされたリポジトリのクローンを作成します。<YOUR_GITHUB_USERNAME> は GitHub ユーザー名で置き換えてください。
git clone https://github.com/<YOUR_GITHUB_USERNAME>/leads-crm-app-demo.git
cloudshell workspace leads-crm-app-demo && cd leads-crm-app-demo
機能ブランチを確認する
その後、事前構築済みの脆弱性を含む両方の機能ブランチがリモートで使用可能であることを確認します。
git branch -a | grep feature/
次のような内容が出力されます
remotes/origin/feature/bulk-operations remotes/origin/feature/bulk-operations-solution remotes/origin/feature/email-composer remotes/origin/feature/lead-search
Antigravity CLI を確認する
次に、Antigravity CLI が Cloud Shell にプリインストールされていることを確認します。利用可能であることを確認します。
agy --version
インストールされている Antigravity CLI のバージョンが表示されます(例: 1.0.13)。
Antigravity CLI をまだ認証していない場合は、この Codelab で認証プロセスの詳細を確認できます。
この時点で、次のものが揃っているはずです。
- フォークされたリポジトリのクローンを作成する
- 両方の機能ブランチが表示されている
agyコマンドが使用可能で、認証されている
3. 問題 - Vibe コード化された機能に潜む脆弱性
シナリオは次のとおりです。チームメンバーが AI エージェントを使用して、見込み顧客検索機能と一括インポート/エクスポート オペレーションという 2 つの機能を Leads CRM アプリに追加しました。どちらの機能も動作します。どちらもセキュリティ レビューなしで迅速にリリースされました。両方のブランチをマージ前に確認します。1 つは CLI を使用してインタラクティブに、もう 1 つは GitHub アクションを使用して自動的に確認します。
最初の機能ブランチを確認する
feature/lead-search の差分を確認します。
git diff main...origin/feature/lead-search
このブランチは検索エンドポイントを追加します。差分をスキャンします。SQL クエリでの文字列連結、入力検証の欠落、クエリの詳細が漏洩するデバッグ ロギング、クライアントに公開される未加工のエラー メッセージなどの問題が見つかるはずです。
+ app.get("/api/leads/search", (req, res) => {
+ const query = req.query.q as string;
+
+ if (!query) {
+ return res.status(400).json({ error: "Search query is required" });
+ }
...
2 番目の機能ブランチを確認する
git diff main...origin/feature/bulk-operations
このブランチでは、一括インポート/エクスポート エンドポイントと管理者統計情報ダッシュボードが追加されています。この脆弱性には、管理者認証情報のハードコード、認証されていない管理者エンドポイント、一括インポート時の入力検証の欠如、エクスポート ファイル名の処理におけるパス トラバーサルのリスクが含まれます。
...
+ const ADMIN_PASSWORD = "admin123";
+
+ app.post("/api/admin/import", (req, res) => {
+ const { password, leads } = req.body;
+
+ if (password !== ADMIN_PASSWORD) {
+ return res.status(401).json({ error: "Invalid admin password" });
+ }
...
両方のブランチで機能が追加されます。どちらにもセキュリティ上の問題があります。問題は、CLI を使用して手動でキャッチするか(ケース 1)、GitHub Action を使用して自動的にキャッチするか(ケース 2)です。
4. ケース 1 : Antigravity CLI を使用したインタラクティブ レビュー
インタラクティブ CLI レビューは、バイブ コーディング セッションの直後、作成したコードのレビュー、チームメンバーの pull リクエストのレビューに最も役立ちます。バイブ コーディングについて言えば、AI エージェントは機能コードを迅速に生成しますが、生成されたすべての行を完全に理解しているとは限りません。また、機能の開発中にコンテキスト構成に応じて、エージェントがセキュリティではなく機能性を重視して最適化されている可能性もあります。
このシナリオでは、セキュリティの脆弱性を含むコードがあり、Antigravity CLI とコードレビューのスキルを使用してコードをインタラクティブにレビューします。このエージェントによるエージェントのレビュー パターンは、デベロッパーの役割がコードの記述から AI 生成コードの承認に移行したときに発生する脆弱性を検出します。また、手動で作成したコードやチームメンバーのブランチを CI に渡す前にレビューする場合にも適用されます。会話を制御する: 特定のファイルに焦点を当てる、検出結果を詳しく調べる、修正をすぐに適用するようエージェントに指示します。
エージェントのスキルがなくても、Antigravity CLI はコードをレビューできますが、一般的なトレーニングの知識に依存するため、ドメイン固有のパターンを見逃したり、セッション間で一貫性のないレビュー基準を適用したりする可能性があります。エージェントのスキルにより、エージェントに構造化されたハンドブックが提供されます。品質に関する 5 軸のレビュー、優先順位付けのための重大度ラベル付けなどです。プロンプトの表現方法に関係なく、審査を繰り返し実施して徹底的に行うことができます。
このステップでは、Antigravity CLI とエージェント スキルを使用して feature/lead-search ブランチを確認し、脆弱性を修正して、クリーンな PR を作成します。
機能ブランチをチェックアウトする
まず、ブランチを Case 1 ブランチに変更します。
git checkout feature/lead-search
次に、エージェント スキルを使用して Antigravity CLI をアップグレードし、レビューを行います。
エージェントのスキルとは
スキルは、エージェントに専門知識を提供する宣言型のマークダウン ファイルです。インストールすると、スラッシュ コマンド(/code-review-and-quality など)になります。汎用エージェントにシニア エンジニアのセキュリティ ハンドブックを渡すようなものだと考えてください。
スキルはエージェント(Antigravity、Claude Code、Cursor など)間で移植可能で、Git 経由で共有できます。Antigravity CLI の場合、ワークスペース(プロジェクト/ローカル)のスキルはプロジェクトのルートにある .agents/skills/ にあります。一方、グローバル スキルは ~/.gemini/config/skills/ に存在します。詳しくは、こちらのドキュメントをご覧ください。
エージェント スキルの機能を示すため、この Codelab では addyosmani/agent-skills のコードレビュー スキルを使用します。
code-review-and-quality- 5 軸レビュー(正確性、読みやすさ、アーキテクチャ、セキュリティ、パフォーマンス)と重大度ラベル。
コードレビュー エージェント スキルをインストールする
次のコマンドを使用すると、スキルは現在の作業ディレクトリの .agents/skills/ にデフォルトでインストールされます(ワークスペース レベルのインストール)。つまり、リポジトリの一部となり、コードとともに commit できるため、プロジェクトのすべてのデベロッパー(および CI パイプライン)が同じレビュー スキルを自動的に取得します。
npx skills add addyosmani/agent-skills --skill code-review-and-quality -y
.agents/skills/code-review-and-quality/SKILL.md ファイルで検査できる詳細なスキルは次のとおりです。
name: code-review-and-quality description: Conducts multi-axis code review. Use before merging any change. Use when reviewing code written by yourself, another agent, or a human. Use when you need to assess code quality across multiple dimensions before it enters the main branch.
主な機能:
- 正しさ、読みやすさ、アーキテクチャ、セキュリティ、パフォーマンスの 5 つの軸に沿ったレビュー
- 重大度別に検出結果にラベル付けして、重大な問題から修正
- 承認基準「完璧でなくても、コード全体の健全性を確実に改善する場合は承認する」を適用します。
これで、実行の準備が整いました。Antigravity CLI でスキルを確認しましょう
AGY を起動してスキルを確認する
Antigravity CLI を実行してみましょう
agy --dangerously-skip-permissions
次のコマンドを実行します。
/skills
Workspace スキルに、次のように 2 つのスキルが表示されます。

機能の差分のコードレビューを実行する
セキュリティ スキルを呼び出し、ブランチのレビューを依頼します。次のプロンプトを入力します。
Review the git diff between main and my current branch. Find any issues based on the agent skills that are appropriate for this. Write the findings and plan to fix them to code_review.md in the current working directory. Do not apply fixes yet.
エージェントは、関連する code-review-and-quality スキルを検出し、自動的に有効にします。差分を読み取り、脆弱性を特定し、提案された修正計画とともに検出結果を code_review.md に書き込みます。

スキャンが完了すると、作業ディレクトリに code_review.md ファイルが作成され、エディタで検査できるようになります。


各検出結果と提案された修正を確認します。プランに問題がなければ、エージェントに適用を依頼します。
Apply the proposed fixes from code_review.md
エージェントはプランを読み取り、計画された各修正をソースファイルに適用します。

必要に応じて、依存関係をインストールして実行し、修正後にアプリが正しく動作するかどうかを確認できます。
npm install
npm run dev
アプリケーションが正常に実行されるはずです。そうでない場合は、反復して Antigravity CLI に修正を依頼できます。
コミットして PR を作成する
必要に応じて、変更を独自のリポジトリに push できます。次のケースに進む前に、まず現在のブランチに変更を commit しましょう。
まだ Git ID を構成していない場合は、まず Git ID を構成する必要があります(自分の名前とメールアドレスに置き換えてください)。
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
変更を commit します。
git add .
git commit -m "fix: address security vulnerabilities in lead search feature"
これで、Antigravity CLI をインタラクティブなレビュー担当者として使用できるようになりました。このスキルにより、構造化された方法論(5 軸コードレビュー)が提供されました。これは、AI 生成コード、自分のコード、チームメイトの貢献をレビューするデベロッパーが対象です。次のセクションでは、このフロー全体を自動化して、コード リポジトリでスケーラブルな自動プロセスにする方法を説明します。ここでは、GitHub を例として使用します。
5. ケース 2 : Antigravity SDK を使用した自動レビュー - パート 1(エージェントの作成)
このステップでは、Antigravity SDK を使用して自動システムによる審査エージェントをビルドし、GitHub アクションとしてデプロイして、2 番目の機能ブランチに対してテストします。エージェントはオンデマンドで PR を確認し、調査結果を PR コメントとして投稿します。
自動システムによる審査のメリット
インタラクティブ CLI レビュー(ケース 1)は、デベロッパーが積極的にレビューする場合に機能します。チームは、すべての PR で自動的に実行されるレビューを必要としています。これにより、投稿者、ツール、時間に関係なく、問題を検出できます。Antigravity SDK(google-antigravity)は、CLI と同じエージェント ランタイムを Python ライブラリとして提供します。ポリシーとフックはコードで構成されます。
GitHub Actions は、GitHub の組み込みの継続的インテグレーション/継続的デプロイ(CI/CD)プラットフォームです。ワークフロー(YAML で定義された自動化スクリプト)は、PR のオープン、コミットの push、コメントの投稿などのリポジトリ イベントに応答して実行されます。ワークフローは GitHub ホストの仮想マシンで実行され、リポジトリ コードにアクセスできます。この場合、PR が作成されるたびに GitHub アクションを使用してセキュリティ レビュー エージェントを実行します。
自動システムによる審査のフローは次のとおりです。

Antigravity SDK(google-antigravity)は、CLI と同じエージェント ランタイムを Python ライブラリとして提供します。ポリシーとフックでエージェントを構成する Python スクリプトを作成し、GitHub アクション内で実行して、結果を PR コメントとして投稿します。
Gemini API キーを取得する
始める前に、Antigravity SDK で使用する Gemini API キーが必要です。Google AI Studio API キーに移動して API キーを作成します。必要に応じて API キーをコピーできます。

このキーは、レビュー エージェントをローカルで実行するときと、後で GitHub Actions シークレットとして使用されます。
パート A: レビュー エージェントを構築する
ケース 2 では、現在の作業ディレクトリを feature/bulk-operations ブランチに切り替えます。
git checkout feature/bulk-operations
これはシナリオの 2 番目の機能ブランチです。CRM アプリに一括インポート/エクスポート エンドポイントと管理者統計情報ダッシュボードを追加します。
Python プロジェクトを設定する
Antigravity SDK は現在 Python でのみ利用できるため、開発には Python 環境が必要です。Python プロジェクト マネージャーには uv を使用します。uv は、Rust で記述された高速の Python パッケージおよびプロジェクト管理ツールです(ドキュメント)。この Codelab では、速度と簡便性を重視してこれを使用します。このチュートリアルで Cloud Shell を使用する場合、インスタンスにすでにプリインストールされています。ローカルにインストールする場合は、こちらのチュートリアルをご覧ください。
uv を使用して、レビュー エージェントの Python プロジェクトを初期化します。
uv init code_review_agent
uv add --project code_review_agent google-antigravity==0.1.7
必要なコードレビュー エージェント ファイルを含む新しいディレクトリ code_review_agent が作成されます。
レビュー スキルをインストールする
審査担当者は、ケース 1 で使用したセキュリティとコードレビューのスキルが必要です。code_review_agent/skills/ にインストールして、SDK エージェントが実行時にロードできるようにします。
npx skills add addyosmani/agent-skills --skill code-review-and-quality -y
cp -r .agents/skills code_review_agent/skills
レビュー エージェントを作成する
次に、code_review_agent/review_agent.py を作成します。次のコマンドを実行します。
cloudshell edit code_review_agent/review_agent.py
次に、次の内容をファイルにコピーします。
#!/usr/bin/env python3
import asyncio
import json
import os
import sys
import pydantic
from google.antigravity import Agent, LocalAgentConfig, CapabilitiesConfig
from google.antigravity.hooks import hooks, policy
from google.antigravity import types
class Finding(pydantic.BaseModel):
file: str
line: int
severity: str
category: str
description: str
proposed_fix: str = ""
class ReviewResult(pydantic.BaseModel):
findings: list[Finding]
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
OUTPUT_FILE = "code_review.md"
SKILLS_PATHS = [
os.path.join(SCRIPT_DIR, "skills", "code-review-and-quality"),
]
review_policies = [
policy.deny_all(),
policy.allow("view_file"),
policy.allow("list_directory"),
policy.allow("search_directory"),
policy.allow("find_file"),
policy.allow("run_command"),
policy.allow("finish"),
]
@hooks.post_tool_call
async def log_tool_results(data: types.ToolResult):
result_str = str(data.result) if data.result else ""
preview = result_str[:200] + "..." if len(result_str) > 200 else result_str
print(f"[audit] tool={data.name} result_len={len(result_str)} error={data.error} preview={preview}", flush=True)
@hooks.pre_tool_call_decide
async def enforce_safe_tools(data: types.ToolCall) -> types.HookResult:
print(f"[audit] calling tool={data.name} args_keys={list(data.args.keys())}", flush=True)
if data.name == "run_command":
cmd = str(data.args.get("CommandLine", ""))
if not cmd.startswith("git "):
return types.HookResult(
allow=False,
message=f"Only git commands are allowed. Blocked: {cmd}"
)
return types.HookResult(allow=True)
async def review_code(target_dir: str) -> dict:
prompt = f"""Run `git diff main...HEAD -- ':!.github' ':!code_review_agent'` in {target_dir} to get the changes on this branch.
Review ONLY the changed code for security vulnerabilities and code quality issues.
"""
config_kwargs = dict(
system_instructions=(
"You are a code review agent. "
"You review code diffs for vulnerabilities and quality issues using the loaded skills. "
"You can run git commands to inspect the diff. "
"You NEVER modify files."
),
response_schema=ReviewResult,
skills_paths=SKILLS_PATHS,
policies=review_policies,
hooks=[log_tool_results, enforce_safe_tools],
)
if os.environ.get("GEMINI_API_KEY"):
config_kwargs["api_key"] = os.environ["GEMINI_API_KEY"]
else:
config_kwargs["vertex"] = True
config_kwargs["project"] = os.environ.get("GOOGLE_CLOUD_PROJECT")
config_kwargs["location"] = os.environ.get("GOOGLE_CLOUD_LOCATION", "global")
config = LocalAgentConfig(**config_kwargs)
async with Agent(config) as agent:
response = await agent.chat(prompt)
last_step = -1
final_text_chunks = []
async for chunk in response.chunks:
if isinstance(chunk, types.ToolCall):
final_text_chunks.clear()
if hasattr(chunk, "text") and hasattr(chunk, "step_index"):
if chunk.step_index != last_step:
final_text_chunks.clear()
last_step = chunk.step_index
final_text_chunks.append(chunk.text)
final_text = "".join(final_text_chunks)
if final_text:
print(final_text)
data = await response.structured_output()
if data and "findings" in data:
return {"findings": data["findings"]}
try:
parsed = json.loads(final_text)
if isinstance(parsed, list):
return {"findings": parsed}
if isinstance(parsed, dict) and "findings" in parsed:
return {"findings": parsed["findings"]}
except json.JSONDecodeError:
pass
return {"findings": final_text}
SEVERITY_EMOJI = {"critical": "🔴", "high": "🟠", "medium": "🟡", "low": "🔵"}
def format_markdown(result: dict) -> str:
findings = result.get("findings", [])
if isinstance(findings, str):
return f"## AI Security Review\n\n{findings}\n"
if not findings:
return "## AI Security Review\n\nNo security issues found.\n"
lines = ["## AI Security Review\n"]
for f in findings:
emoji = SEVERITY_EMOJI.get(f.get("severity", "").lower(), "⚪")
lines.append(f"### {emoji} [{f.get('severity', 'unknown').upper()}] {f.get('category', '')}\n")
lines.append(f"**{f.get('file', '')}:{f.get('line', '')}**\n")
lines.append(f"{f.get('description', '')}\n")
proposed_fix = f.get('proposed_fix', '')
if proposed_fix:
lines.append(f"**Proposed fix:** {proposed_fix}\n")
lines.append("---\n*Powered by Antigravity SDK*")
return "\n".join(lines)
if __name__ == "__main__":
target = sys.argv[1] if len(sys.argv) > 1 else "."
result = asyncio.run(review_code(target))
markdown = format_markdown(result)
with open(OUTPUT_FILE, "w") as f:
f.write(markdown)
print(f"Review written to {OUTPUT_FILE}")
print(json.dumps(result, indent=2))
このエージェントの主な設計上の決定事項を見ていきましょう。
- デフォルトで拒否するポリシー:
policy.deny_all()はすべてをブロックし、ファイル読み取りツールとrun_command(git 用)のみを明示的に許可します。 - 2 つのレイヤでの適用: ポリシーはフレームワーク レベルで制限し、
enforce_safe_toolsフックは 2 つ目のレイヤを提供します。これにより、run_commandを介したgitコマンドのみが許可されます。 - Git diff スコーピング: エージェントは
git diff main...HEADを実行して、コードベース全体ではなく、変更されたコードのみを確認します。 - フォールバック付きの構造化出力:
response_schema=ReviewResultは、SDK の終了ツールを介して JSON 構造を適用します。解析が失敗した場合、代替チェーンはtext()を JSON として解析しようとし、その後、未加工のテキストを返します。 - 認証フォールバック:
GEMINI_API_KEYが使用可能な場合はGEMINI_API_KEYを使用し、それ以外の場合はアプリケーションのデフォルト認証情報を使用して Vertex AI にフォールバックします。 - ファイル出力: フォーマットされた Markdown の結果を
code_review.mdに書き込みます。GitHub アクションはこのファイルを読み取り、後で PR コメントとして投稿します。
レビュー エージェントをテストする
プロジェクトのルートからテストします。SDK は環境から GEMINI_API_KEY を読み取るため、キーを環境に配置します。
export GEMINI_API_KEY=YOUR_API_KEY
次のコマンドを実行して、ローカルで実行します。
uv run --project code_review_agent code_review_agent/review_agent.py .
実行中は、現在使用しているツールを説明するコンソール出力が表示されます。security-and-hardening と code-review-and-quality のエージェント スキルにアクセスしていることがわかります。
[audit] calling tool=view_file args_keys=['AbsolutePath', 'IsSkillFile'] [audit] tool=view_file result_len=47 error=None preview=Read security and hardening skill documentation [audit] calling tool=view_file args_keys=['AbsolutePath', 'IsSkillFile'] [audit] tool=view_file result_len=48 error=None preview=Read code review and quality skill documentation [audit] calling tool=run_command args_keys=['CommandLine', 'Cwd', 'WaitMsBeforeAsync'] ...
エージェントは git diff main...HEAD を実行し、変更されたコードのみを確認して、フォーマットされた結果を code_review.md に書き込み、構造化された JSON をコンソールに出力します。次のように、エディタで記述した code_review.md を検査できます。

ローカルではすでに動作しています。次の部分に進みましょう。GitHub アクション構成の作成
6. ケース 2 : Antigravity SDK を使用した自動レビュー - パート 2(Github Actions の構成)
始める前に、以前に生成された code_review.md ファイルが存在する場合は削除しましょう。
rm -f code_review.md
次に、Github Action YAML 構成ファイルを作成する必要があります。
mkdir -p .github/workflows
cloudshell edit .github/workflows/code_review.yml
次に、このファイルに次の内容を追加します。
name: AI Code Security and Quality Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
container:
image: ghcr.io/astral-sh/uv:python3.12-bookworm
steps:
- name: Install git
run: apt-get update && apt-get install -y git
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Run security review
env:
GEMINI_API_KEY: ${{ secrets.GEMINI_API_KEY }}
run: |
git config --global --add safe.directory $GITHUB_WORKSPACE
uv run --project code_review_agent code_review_agent/review_agent.py .
- name: Post findings as PR comment
if: always()
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
const body = fs.readFileSync('code_review.md', 'utf8');
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
body: body
});
このワークフローは、PR が開かれるか更新されると自動的にトリガーされます。完全な git 履歴(git diff main...HEAD に必要)で PR ブランチをチェックアウトし、レビュー エージェントを実行して code_review.md に結果を書き込み、ファイルの内容を PR コメントとして投稿します。
すべての変更を commit して Github リモートに push します。これで、この統合をテストする準備が整いました。
git add .
git commit -m "Add AI code security-quality review agent and GitHub Action"
git push origin feature/bulk-operations
7. ケース 2 : Antigravity SDK を使用した自動レビュー - パート 3(自動コードレビューのテスト)
次に、フォークしたリポジトリの https://github.com/<YOUR_GITHUB_USERNAME>/leads-crm-app-demo ウェブページに移動し、Settings をクリックします。

左側のパネルで Secrets and variables を見つけてクリックし、Actions を選択します。

次に、New repository secret をクリックして GEMINI_API_KEY シークレットを構成します。

次に Pull Request を選択し、自分のリポジトリのブランチ feature/bulk_operations から main ブランチへの新しい Pull Request を作成します。


pull リクエストが作成されると、Github Actions が実行されます。これは、Checks メニューまたは Merge pull request ボタンの近くで確認できます。

実行中のアクションをクリックすると詳細が表示されます。完了すると、以下のようにレビュー結果がプルリクエストのコメントとして投稿されます。

8. まとめ
おめでとうございます!
バイブ コーディングされた機能のセキュリティの脆弱性を検出するための 2 つの完全なコードレビュー ワークフローを構築しました。
- ケース 1(インタラクティブ): エージェント スキルを備えた Antigravity CLI が、機能ブランチの差分を確認し、SQL インジェクションなどの脆弱性を特定して、OWASP パターンに従って修正し、クリーンな PR を生成しました。
- ケース 2(自動化): Antigravity SDK は、すべての PR を自動的にレビューし、構造化されたセキュリティ結果を PR コメントとして投稿する GitHub アクションを強化しました。
学習した内容
- バイブ コーディングがセキュリティ リスクを生み出す仕組みと、自動システムによる審査で手動審査では見逃されるものを検出できる理由
- エージェント スキルをインストールして使用し、Antigravity CLI に構造化されたセキュリティの専門知識を提供する
- 機能ブランチの差分をインタラクティブに確認し、問題を修正してクリーンな PR を作成する方法
- デフォルトで拒否ポリシーとライフサイクル フックを使用して Antigravity SDK で読み取り専用の審査エージェントを構築する方法
- 自動システムによる審査パイプラインを GitHub アクションとしてデプロイし、インタラクティブなフォローアップをサポートする方法
クリーンアップ
PR をクローズする
GitHub のフォークで各 pull リクエストに移動し、[Close pull request] をクリックします。feature/bulk-operations PR はマージしないでください。パッチが適用されていない脆弱なコードがまだ含まれています。
フォークされたリポジトリを削除する(省略可)
フォークが不要になった場合は、GitHub のフォークに移動し、[Settings] -> [Danger Zone] -> [Delete this repository] を選択します。
次のステップ
- Antigravity CLI プラグインとスキル - カスタム スキルとプラグインを作成する
- Antigravity CLI の権限とサンドボックス - きめ細かいツールポリシーと OS レベルのサンドボックス
- Antigravity SDK のフックとポリシー - 高度なパターン(レート制限、エラー回復、ミドルウェア)
- Antigravity SDK の例 - 本番環境パターン用の
agent_middleware.py