Kod Kalitesini Artırın: Antigravity CLI ve SDK ile Yapay Zeka Destekli Kod İnceleme

1. Giriş

Sezgisel kodlama (doğal dil istemlerinden kod yazmak için yapay zeka aracı kullanma), geliştiricinin rolünü yazardan düzenleyiciye ve incelemeciye dönüştürür. Mükemmel bağlamı hazırlamaya güveniyor ve yapay zeka aracılarının bizim için her şeyi yapacağına inanıyoruz. Bu süreç, spesifikasyon belgelerini hazırlamaktan kodun tüm gereksinimleri karşılamasını sağlamaya kadar uzanabilir. Risk: Hızlı yineleme döngülerinde, işlevsel kod kapsamlı bir güvenlik incelemesi yapılmadan onaylanır. Modern ajanlar genellikle varsayılan olarak güvenli kod üretir ancak "genellikle" her zaman "her zaman" anlamına gelmez ve biriken güvenlik açıkları manuel incelemeden kaçabilir.

Bu codelab, Antigravity'yi inceleyici olarak kullanmaya yönelik iki yaklaşımı öğreterek bu sorunları ele alır: CLI ile geliştirme sırasında etkileşimli olarak (inceleme, düzeltme ve ardından PR) ve SDK ile sürekli entegrasyonda otomatik olarak (ajan her çekme isteğini inceler ve sonuçları yorum olarak yayınlar).

İçerik

Potansiyel müşteriler için bir CRM uygulamasına vibe kodu uyguladınız. Yapay zeka aracısı, Express arka ucu, SQLite veritabanı ve React ön ucu gibi tüm yığını sizin için oluşturdu. İşe yarıyor. Ardından, temsilciden iki yeni özellik eklemesini istediniz: potansiyel müşteri arama işlevi ve yönetici istatistikleriyle toplu içe/dışa aktarma. Ajan, her ikisini de hızlı bir şekilde teslim etti. Kod çalışır, özellikler işlev görür ve PR'ler hazırdır.

Ancak sorun şu: Bu kodu siz yazmadınız. Onayladığınız için Arama uç noktasının SQL yerleştirme güvenlik açığına karşı savunmasız olmadığını nasıl anlarsınız? Yönetici rotasında sabit kodlu şifre olmadığını nasıl anlarsınız? Yapay zekayla üretilen kodun her satırını okumak, sizi ilk başta sezgisel kodlamaya yönlendiren hız avantajını ortadan kaldırır.

Bu codelab'de bu sorunu çözmenin iki yolu açıklanmaktadır:

  • 1. örnek: Etkileşimli inceleme: Güvenlik açıkları olan bir özellik dalını inceleyin, farkı incelemek, sorunları düzeltmek ve temiz bir çekme isteği oluşturmak için Antigravity CLI'ı kullanın.
  • 2. örnek: Otomatik inceleme: Antigravity SDK tarafından desteklenen bir GitHub Action oluşturun. Bu Action, PR'leri otomatik olarak inceler, yapılandırılmış bulguları yorum olarak yayınlar ve geliştiriciler incelemeyle ilgili takip soruları sorduğunda yanıt verir.

8e05b6954f30ee3b.jpeg

Neler öğreneceksiniz?

  • Sezgisel kodlamanın nasıl güvenlik riskleri oluşturabileceği ve otomatik incelemenin, manuel incelemenin gözden kaçırdığı noktaları neden yakaladığı
  • Antigravity CLI'ya derinlemesine güvenlik ve kod inceleme uzmanlığı kazandırmak için topluluk tarafından desteklenen aracı becerilerini yükleme ve kullanma
  • Özellik dalı farklılıklarını incelemek, güvenlik açıklarını düzeltmek ve temiz bir çekme isteği oluşturmak için KSA'yı etkileşimli olarak kullanma
  • Bildirim temelli güvenlik politikaları ve yaşam döngüsü kancaları içeren salt okunur bir kod inceleme aracısı oluşturmak için Antigravity SDK'yı kullanma
  • İnceleme aracısını, PR'leri inceleyen ve sonucu PR yorumu olarak yayınlayan bir GitHub Action olarak dağıtma

Ön koşullar

  • Google Cloud hesabı
  • GitHub hesabı
  • Terminal, sürüm kontrolü ve CI/CD hakkında temel bilgi

2. Ortam Kurulumu

Bu adımda Leads CRM uygulama deposu çatallanır, Cloud Shell'de klonlanır, Antigravity CLI kurulur ve kimlik doğrulaması yapılır.

Depoyu çatallama

GitHub Actions ile commit'leri göndereceğiniz ve PR'ler oluşturacağınız için deponun kendi kopyanıza ihtiyacınız vardır.

Aşağıdaki depoya gidin

Ardından Fork'u (Çatal) tıklayın. Çatal oluşturma sayfasında "Yalnızca main dalını kopyala" onay kutusunun işaretini kaldırın. Çatalınıza diğer özellik dallarının (feature/lead-search ve feature/bulk-operations) dahil edilmesi gerekir.

3f996e391d2d5cf4.png7e4089174c2adb07.png

Cloud Shell'i açma

Tarayıcınızda Cloud Shell'i açın. Cloud Shell, bu codelab için ihtiyacınız olan tüm araçların bulunduğu önceden yapılandırılmış bir ortam sunar. İstendiğinde Yetkilendir'i tıklayın.

.

Ardından, terminali açmak için "Görünüm" -> "Terminal"i tıklayın. Arayüzünüz aşağıdaki gibi görünmelidir.

86307fac5da2f077.png

Bu, ana arayüzümüz olacak. Üstte IDE, altta terminal yer alacak.

Kimliği GitHub ile doğrulama

Cloud Shell'de varsayılan olarak GitHub kimlik bilgileri yapılandırılmamıştır ancak gh KSA'sı zaten yüklüdür. Daha sonra commit gönderebilmek ve PR oluşturabilmek için kimlik doğrulamayı ayarlayın:

gh auth login

303f60fa2e73b305.png

Github.com adlı yolu seç

97e55d4bb4a167af.pngHTTPS'ı seçin ( veya başka bir mekanizmayı kullanmaya alışkınsanız onu seçebilirsiniz).

561493764dbe64ef.png

Ardından Y simgesini seçin.

ed05929c1bcb731.png

Ardından Login with a web browser simgesini seçin.

**,**Tek kullanımlık kodu kopyalayıp tarayıcıda giriş sayfasını açtığınızda girmeniz istenir. Ctrl + Click simgesini tıklayarak terminaldeki URL'yi açabilirsiniz. https://github.com/login/device URL'si açılır. Giriş yapmak istediğiniz hesabı seçmeniz ve kodu girmeniz istenir.

915314584db6766d.png

Ardından Cloud Shell konsol sayfasına geri dönün. Terminal çıkışını aşağıdaki gibi görürsünüz.

✓ 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

Bu, Cloud Shell'de GitHub hesabınızın kimlik doğrulamasını başarıyla ayarladığınız anlamına gelir.

Çatalını oluşturduğunuz depoyu klonlama

Şimdi, çatalladığınız deponuzu klonlayalım. <YOUR_GITHUB_USERNAME> yerine GitHub kullanıcı adınızı girin:

git clone https://github.com/<YOUR_GITHUB_USERNAME>/leads-crm-app-demo.git
cloudshell workspace leads-crm-app-demo && cd leads-crm-app-demo

Özellik dallarını doğrulama

Ardından, önceden oluşturulmuş güvenlik açıkları içeren her iki özellik dalının da uzak depoda mevcut olması gerektiğini doğrulayın:

git branch -a | grep feature/

Aşağıdaki çıkışı görmeniz gerekir.

remotes/origin/feature/bulk-operations
remotes/origin/feature/bulk-operations-solution
remotes/origin/feature/email-composer
remotes/origin/feature/lead-search

Antigravity CLI'yı doğrulama

Ardından, Antigravity CLI'nın Cloud Shell'de önceden yüklendiğini doğrulayalım. Kullanılabilir olduğunu doğrulayın:

agy --version

Yüklü Antigravity CLI sürümünü görmelisiniz. Örneğin: 1.0.13

Antigravity CLI'yi henüz doğrulamadıysanız doğrulama sürecini daha ayrıntılı olarak görmek için bu codelab'e gidebilirsiniz.

Bu noktada aşağıdakilere sahip olmanız gerekir:

  • Klonlanan çatallanmış depo
  • Her iki özellik dalı da görünür
  • agy komutu kullanılabilir ve kimliği doğrulanmış

3. Sorun: Vibe-Coded Özelliklerde Gizlenen Güvenlik Açıkları

Senaryo: Bir ekip arkadaşı, Leads CRM uygulamasına iki özellik eklemek için yapay zeka aracısı kullandı: potansiyel müşteri arama işlevi ve toplu içe/dışa aktarma işlemleri. Her iki özellik de çalışır. İkisi de güvenlik incelemesi yapılmadan hızlı bir şekilde gönderildi. Birini CLI ile etkileşimli olarak, diğerini ise GitHub Action ile otomatik olarak birleştirmeden önce her iki dalı da inceleyeceksiniz.

İlk özellik dalını inceleme

feature/lead-search üzerindeki farkı inceleyin:

git diff main...origin/feature/lead-search

Bu dal, bir arama uç noktası ekler. Farkı tarayın. SQL sorgularında dize birleştirme, eksik giriş doğrulama, sorgu ayrıntılarını sızdıran hata ayıklama günlüğü ve istemciye sunulan ham hata mesajları gibi sorunları tespit etmeniz gerekir.

+  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" });
+    }
...

İkinci özellik dalını inceleyin

git diff main...origin/feature/bulk-operations

Bu dalda toplu içe/dışa aktarma uç noktaları ve bir yönetici istatistikleri kontrol paneli eklenir. Buradaki güvenlik açıkları arasında sabit kodlanmış yönetici kimlik bilgileri, kimliği doğrulanmamış yönetici uç noktaları, toplu içe aktarmada giriş doğrulama olmaması ve dışa aktarılan dosya adı işleme sırasında dosya yolu manipülasyonu riski yer alır.

...
+  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" });
+    }
...

Her iki dal da işlevsel özellikler ekler. Her ikisinde de güvenlik sorunları vardır. Bu durumda, bunları yakalamanın iki yolu vardır: CLI ile manuel olarak (1. durum) veya GitHub Action ile otomatik olarak (2. durum).

4. 1. örnek : Antigravity CLI ile etkileşimli inceleme

Etkileşimli KSA incelemesi, sezgisel kodlama oturumundan hemen sonra, yeni yazdığınız kodu veya takım arkadaşlarınızın pull isteğini incelemek için en değerlidir. Vibe-coding'den bahsediyorsak yapay zeka aracısı, özellik kodunuzu hızlı bir şekilde oluşturmuştur ancak ürettiği her satırı tam olarak anlamayabilirsiniz ve aracı, özelliği geliştirirken bağlam yapılandırmasına bağlı olarak güvenlik için değil, işlevsellik için optimize edilmiş olabilir.

Bu senaryoda, güvenlik açıkları olan kodlarımız var ve kodu etkileşimli olarak incelemek için kod inceleme becerileriyle birlikte Antigravity CLI'yı kullanacağız. Bu aracı inceleyen aracı modeli, geliştiricinin rolü kod yazmaktan yapay zekayla üretilen kodu onaylamaya kaydığında gözden kaçan güvenlik açıklarını yakalar. Ayrıca, kendi yazdığınız kodu veya bir ekip arkadaşınızın dalını CI'dan geçmeden önce incelerken de geçerlidir. Sohbeti kontrol edebilirsiniz: Aracının belirli dosyalara odaklanmasını, bir bulguyu daha ayrıntılı incelemesini veya düzeltmeleri hemen uygulamasını isteyin.

Antigravity CLI, aracı becerileri olmadan da kodu inceleyebilir ancak alana özgü kalıpları kaçırabilecek veya oturumlar arasında tutarsız inceleme ölçütleri uygulayabilecek genel eğitim bilgilerine dayanır. Temsilci becerileri, temsilciye yapılandırılmış bir oyun planı sunar: kalite için beş eksenli inceleme, önceliklendirme için önem derecesi etiketleme. İsteminizi nasıl ifade ettiğinizden bağımsız olarak inceleme tekrarlanabilir ve kapsamlı hale gelir.

Bu adımda, feature/lead-search dalını incelemek, güvenlik açıklarını düzeltmek ve temiz bir PR oluşturmak için Antigravity CLI ile aracı becerileri kullanılır.

Özellik dalına göz atma

Öncelikle, dalımızı Case 1 dalı olarak değiştirelim:

git checkout feature/lead-search

Ardından, inceleme yapmak için Antigravity CLI'mizi agent skills ile yükseltelim.

Temsilci becerileri nelerdir?

Beceriler, aracıya uzmanlık bilgisi veren bildirimsel Markdown dosyalarıdır. Yüklendikten sonra eğik çizgi komutlarına (ör. /code-review-and-quality) dönüşürler. Bunları, genel amaçlı bir temsilciye kıdemli bir mühendisin güvenlik kılavuzunu vermek gibi düşünebilirsiniz.

Beceriler, temsilciler (Antigravity, Claude Code, Cursor vb.) arasında taşınabilir ve Git üzerinden paylaşılabilir. Antigravity CLI için çalışma alanı (proje/yerel) becerileri, proje kökündeki .agents/skills/ içinde yer alır. Global beceriler ise ~/.gemini/config/skills/ içinde yer alır. Daha fazla bilgi için bu belgeye göz atın.

Bu codelab'de, ajan becerileri özelliklerini göstermek için addyosmani/agent-skills adresindeki kod inceleme becerisi kullanılacaktır:

  • code-review-and-quality – Ciddiyet etiketlemesiyle beş eksenli inceleme (doğruluk, okunabilirlik, mimari, güvenlik, performans).

Kod inceleme aracısı becerisini yükleme

Aşağıdaki komut kullanılarak beceri, mevcut çalışma dizininde (çalışma alanı düzeyinde bir yükleme) varsayılan olarak .agents/skills/ içine yüklenir. Bu sayede, depoya eklenirler ve kodunuzla birlikte işlenebilirler. Böylece, projedeki her geliştirici (ve CI ardışık düzeni) aynı inceleme becerilerini otomatik olarak alır.

npx skills add addyosmani/agent-skills --skill code-review-and-quality -y

.agents/skills/code-review-and-quality/SKILL.md dosyasında incelenebilecek ayrıntılı beceri aşağıda verilmiştir:

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.

Temel özellikler:

  • Beş eksende incelemeler: doğruluk, okunabilirlik, mimari, güvenlik ve performans
  • Bulguları önem derecesine göre etiketleyerek önce kritik sorunları düzeltmenizi sağlar.
  • Onay standardını uygular: "Mükemmel olmasa bile genel kod sağlığını kesinlikle iyileştirdiğinde onayla"

Artık uygulamaya geçmeye hazırız. Antigravity CLI'da beceriyi doğrulayalım

AGY'yi kullanıma sunma ve becerileri doğrulama

Antigravity CLI'yı çalıştıralım

agy --dangerously-skip-permissions

Ardından aşağıdaki komutu çalıştırın.

/skills

2 becerinin Workspace becerileri altında aşağıdaki gibi gösterildiğini görürsünüz.

490090ce9f955d1c.png

Özellik farkının kod incelemesini çalıştırma

Güvenlik becerisini etkinleştirin ve şubenizi incelemesini isteyin. Şu istemi yazın:

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.

Aracı, alakalı code-review-and-quality becerisini algılar ve otomatik olarak etkinleştirir. Farkı okur, güvenlik açıklarını tanımlar ve bulguları code_review.md ile ilgili önerilen bir düzeltme planıyla birlikte yazar.

86c054f06c122df8.png

Tarama tamamlandıktan sonra çalışma dizininizde code_review.md dosyası oluşturulur. Bu dosyayı düzenleyicide inceleyebilirsiniz.

bcd382689b0a95fa.png2b6892e261c046b2.png

Her bulguyu ve önerilen düzeltmeyi inceleyin. Plana onay verdiğinizde ajandan planı uygulamasını isteyin:

Apply the proposed fixes from code_review.md

Aracı, planı okur ve planlanan her düzeltmeyi kaynak dosyalara uygular.

cc1e5bb5ad9533c7.png

Artık, düzeltme işleminden sonra uygulamanın doğru şekilde çalışıp çalışmadığını kontrol etmek için bağımlılıkları yükleyip uygulamayı çalıştırabilirsiniz.

npm install
npm run dev

Uygulama düzgün şekilde çalışmalıdır. Değilse yineleme yapabilir ve Antigravity CLI'dan düzeltmesini isteyebilirsiniz.

Commit işlemi yapma ve PR oluşturma

İsterseniz değişiklikleri kendi deponuza aktarabilirsiniz. Bir sonraki duruma geçmeden önce değişiklikleri mevcut dala aktaralım.

Henüz yapmadıysanız önce Git kimliğinizi yapılandırmanız gerekir (kendi adınız ve e-postanızla değiştirin):

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

Ardından değişiklikleri işleyin.

git add .
git commit -m "fix: address security vulnerabilities in lead search feature"

Artık Antigravity CLI'yı etkileşimli bir inceleyici olarak kullandınız. Bu beceriler, beş eksenli kod incelemesi gibi yapılandırılmış bir metodoloji sunar. Bu özellik, yapay zekayla üretilen kodu, kendi kodunuzu veya bir ekip arkadaşınızın katkısını inceleyen geliştirici olduğunuzda çalışır. Sonraki bölümde, bu akışın tamamını otomatikleştirerek GitHub'ı örnek olarak kullanarak kod deponuzda ölçeklenebilir bir otomatik süreç haline getireceğiz.

5. 2. örnek : Antigravity SDK ile otomatik inceleme - 1. bölüm ( Aracı oluşturma)

Bu adımda, Antigravity SDK kullanılarak otomatik bir inceleme aracısı oluşturulur, GitHub Action olarak dağıtılır ve ikinci özellik dalına göre test edilir. Temsilci, talep üzerine PR'leri inceler ve bulguları PR yorumları olarak yayınlar.

Neden otomatik inceleme?

Etkileşimli CLI incelemesi (1. örnek), geliştirici aktif olarak inceleme yaptığında çalışır. Ekiplerin, her çekme isteğinde otomatik olarak çalışan ve katkıda bulunan herkesin, her aracın ve her zaman karşılaştığı sorunları tespit eden bir incelemeye ihtiyacı vardır. Antigravity SDK (google-antigravity), CLI ile aynı aracı çalışma zamanını Python kitaplığı olarak sağlar. Politikalar ve kancalar kodda yapılandırılır.

GitHub Actions, GitHub'ın yerleşik Sürekli Entegrasyon/Sürekli Geliştirme (CI/CD) platformudur. YAML'de tanımlanan otomatik komut dosyaları olan iş akışlarını, PR açma, commit gönderme veya yorum yayınlama gibi depo etkinliklerine yanıt olarak çalıştırır. İş akışları, GitHub tarafından barındırılan sanal makinelerde çalışır ve depo koduna erişebilir. Bu durumda, her çekme isteği oluşturulduğunda bir güvenlik inceleme aracısı çalıştırmak için GitHub Action kullanırsınız.

Otomatik inceleme akışının işleyiş şekli:

393f76210e797217.png

Antigravity SDK ( google-antigravity), CLI ile aynı aracı çalışma zamanını Python kitaplığı olarak sağlar. Aracıyı politikalar ve kancalarla yapılandıran bir Python komut dosyası yazarsınız, bunu bir GitHub Action içinde uygularsınız ve sonuçları bir çekme isteği yorumu olarak yayınlarsınız.

Gemini API anahtarı edinme

Başlamadan önce Antigravity SDK'sının kullanması için Gemini API anahtarı gerekir. Google AI Studio API Anahtarı'na gidip bir API anahtarı oluşturun. İhtiyaç duyduğunuzda API anahtarını kopyalayabilirsiniz.

57b306d2292c60bf.png

Bu anahtar, inceleme aracısı yerel olarak çalıştırılırken ve daha sonra GitHub Actions gizlisi olarak kullanılır.

A Bölümü: İnceleme temsilcisini oluşturma

Şimdi 2. durum için mevcut çalışma dizininizi feature/bulk-operations dalına geçirelim:

git checkout feature/bulk-operations

Bu, senaryodaki ikinci özellik dalıdır. CRM uygulamasına toplu içe/dışa aktarma uç noktaları ve yönetici istatistikleri kontrol paneli ekler.

Python projesini oluşturma

Antigravity SDK şu anda yalnızca Python'da kullanılabilir. Bu nedenle, geliştirmek için bir Python ortamına ihtiyacımız olacak. Python proje yöneticimiz için uv kullanacağız. uv, Rust ile yazılmış hızlı bir Python paketi ve proje yöneticisidir ( dokümanlar). Bu codelab, hız ve basitlik için bu yöntemi kullanır. Bu eğitim için Cloud Shell'i kullanıyorsanız bu araç, örnekte önceden yüklenmiştir. Yerel makinenize yüklemek istiyorsanız bu eğitime bakın.

uv kullanarak inceleme aracısı için bir Python projesi başlatın:

uv init code_review_agent
uv add --project code_review_agent google-antigravity==0.1.7

Bu işlem, gerekli kod inceleme aracısı dosyalarımızı içeren yeni bir dizin code_review_agent oluşturur.

İnceleme becerilerini yükleme

İnceleme temsilcisinin, 1. örnektekiyle aynı güvenlik ve kod inceleme becerilerine sahip olması gerekir. Bunları code_review_agent/skills/ içine yükleyin. Böylece SDK aracısı bunları çalışma zamanında yükler:

npx skills add addyosmani/agent-skills --skill code-review-and-quality -y
cp -r .agents/skills code_review_agent/skills

İnceleme aracısını oluşturma

Şimdi code_review_agent/review_agent.py oluşturalım . Aşağıdaki komutu çalıştırın:

cloudshell edit code_review_agent/review_agent.py

Ardından, aşağıdaki içeriği dosyaya kopyalayın.

#!/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))

Bu ajandaki önemli tasarım kararlarını inceleyin:

  • Varsayılan olarak reddetme politikaları: policy.deny_all() her şeyi engeller, ardından yalnızca dosya okuma araçlarının ve run_command'ün (git için) açık olmasına izin verir.
  • İki katmanlı zorunlu kılma: Politikalar, çerçeve düzeyinde kısıtlamalar uygular ve enforce_safe_tools kancası ikinci bir katman sağlayarak yalnızca run_command üzerinden git komutlarına izin verir .
  • Git diff kapsamı: Aracı, yalnızca değiştirilen kodu incelemek için git diff main...HEAD komutunu çalıştırır. Kod tabanının tamamı incelenmez.
  • Yedekli yapılandırılmış çıkış: response_schema=ReviewResult, SDK'nın bitirme aracıyla JSON yapısını zorunlu kılar. Ayrıştırma başarısız olursa yedek zincir, text() öğesini JSON olarak ayrıştırmayı dener ve ardından ham metni döndürür.
  • Kimlik doğrulama yedeklemesi: Kullanılabiliyorsa GEMINI_API_KEY kullanılır, aksi takdirde Uygulama Varsayılan Kimlik Bilgileri aracılığıyla Vertex AI'a geri dönülür.
  • Dosya çıkışı: Biçimlendirilmiş Markdown bulgularını code_review.md konumuna yazar. GitHub Action bu dosyayı okur ve daha sonra PR yorumu olarak yayınlar.

İnceleme aracısını test etme

Testi proje kökünden yapın. SDK, ortamdan GEMINI_API_KEY değerini okur. Bu nedenle, anahtarı ortama yerleştirelim.

export GEMINI_API_KEY=YOUR_API_KEY

Ardından, yerel olarak çalıştırmak için aşağıdaki komutu çalıştırın.

uv run --project code_review_agent code_review_agent/review_agent.py .

Çalışırken, şu anda hangi araçları kullandığını açıklayan bazı konsol çıktıları gösterir. Ajanın security-and-hardening ve code-review-and-quality becerilerine eriştiğini görebilirsiniz.

[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']
...

Aracı git diff main...HEAD komutunu çalıştırır, yalnızca değiştirilen kodu inceler, biçimlendirilmiş bulguları code_review.md dosyasına yazar ve yapılandırılmış JSON'ı konsola yazdırır. Yazılan code_review.md karakterini aşağıdaki gibi düzenleyicide inceleyebilirsiniz.

e8f97c737aaf934b.png

Yerel olarak zaten çalışıyor. Şimdi bir sonraki bölüme geçelim. GitHub Action yapılandırmasını oluşturma

6. 2. örnek : Antigravity SDK ile otomatik inceleme - 2. bölüm ( GitHub Actions'ı yapılandırma)

Başlamadan önce, daha önce oluşturulan code_review.md dosyasını varsa silelim.

rm -f code_review.md

Şimdi, GitHub Action YAML yapılandırma dosyasını oluşturmamız gerekiyor.

mkdir -p .github/workflows
cloudshell edit .github/workflows/code_review.yml

Ardından, dosyaya aşağıdaki içeriği ekleyin.

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
            });

İş akışı, bir çekme isteği açıldığında veya güncellendiğinde otomatik olarak tetiklenir. Tam git geçmişiyle (git diff main...HEAD için gereklidir) PR dalını kontrol eder, bulguları code_review.md'ye yazan inceleme aracısını çalıştırır ve dosya içeriklerini PR yorumu olarak yayınlar.

Şimdi tüm değişiklikleri kaydedip GitHub uzak deposuna aktaralım. Bu entegrasyonu test etmeye hazırız.

git add .
git commit -m "Add AI code security-quality review agent and GitHub Action"
git push origin feature/bulk-operations

7. 2. örnek : Antigravity SDK ile Otomatik İnceleme - Bölüm 3 (Otomatik Kod İncelemesini Test Etme)

Şimdi, çatalladığınız deponun https://github.com/<YOUR_GITHUB_USERNAME>/leads-crm-app-demo web sayfasına gidip Settings simgesini tıklayın.

15e07c4d8c425e33.png

Ardından, sol panelde Secrets and variables simgesini bulup tıklayın ve Actions simgesini seçin.

67d1b299fcd242b4.png

Ardından New repository secret gizli dizisini yapılandırmak için GEMINI_API_KEY simgesini tıklayın.

b8c270070e1613c9.png

Ardından Pull Request simgesini seçin ve kendi deponuzun feature/bulk_operations dalından main dalına yeni bir çekme isteği oluşturun.

e37f57b56a143d9c.pngda9b78d57c0aec4e.png

Çekme isteği oluşturulduktan sonra, Checks menüsünde veya Merge pull request düğmesinin yakınında inceleyebileceğiniz GitHub Actions çalıştırılır.

b9b811c4430f7702.png

Ayrıntıları görmek için çalışan işlemleri tıklayabilirsiniz. İşlem tamamlandığında, inceleme sonuçları aşağıdaki gibi çekme isteği yorumu olarak yayınlanır.

544d4d820019e58.png

8. Özet

Tebrikler!

Vibe kodlu özelliklerdeki güvenlik açıklarını yakalamak için iki eksiksiz kod inceleme iş akışı oluşturdunuz:

  • 1. örnek (Etkileşimli): Antigravity CLI, aracı becerileriyle birlikte bir özellik dalı farkını inceledi, SQL ekleme ve diğer güvenlik açıklarını belirledi, bunları OWASP kalıplarına göre düzeltti ve temiz bir PR oluşturdu.
  • 2. örnek (Otomatik): Antigravity SDK, her çekme isteğini otomatik olarak inceleyen ve yapılandırılmış güvenlik bulgularını çekme isteği yorumları olarak yayınlayan bir GitHub Action'a güç verdi.

Öğrendikleriniz

  • Sezgisel kodlamanın nasıl güvenlik riskleri oluşturduğu ve otomatik incelemenin, manuel incelemenin gözden kaçırdıklarını neden yakaladığı
  • Antigravity CLI'ya yapılandırılmış güvenlik uzmanlığı sağlamak için ajan becerilerini yükleme ve kullanma
  • Bir özellik dalı farkını etkileşimli olarak inceleme, sorunları düzeltme ve temiz bir çekme isteği oluşturma
  • Varsayılan olarak reddetme politikaları ve yaşam döngüsü kancaları kullanarak Antigravity SDK ile salt okunur bir inceleme aracısı oluşturma
  • Etkileşimli takip desteğiyle otomatik inceleme ardışık düzenini GitHub işlemi olarak dağıtma

Temizleme

PR'leri kapatma

GitHub'da çatallanmış deponuzdaki her pull isteğine gidip Çekme isteğini kapat'ı tıklayın. feature/bulk-operations PR'yi birleştirmeyin. Bu PR, hâlâ yama uygulanmamış güvenlik açığı içeren kodu barındırıyor.

Çatal oluşturulan kod deposunu silme (isteğe bağlı)

Artık fork'a ihtiyacınız yoksa GitHub'daki fork'unuza gidin: Settings (Ayarlar) -> Danger Zone'a (Tehlikeli Bölge) gidin -> Delete this repository'yi (Bu depoyu sil) tıklayın.

Sırada ne var?