1. 소개
바이브 코딩(AI 에이전트를 사용하여 자연어 프롬프트에서 코드를 작성)을 사용하면 개발자의 역할이 작성자에서 오케스트레이터 및 검토자로 바뀝니다. 완벽한 컨텍스트를 준비하고 AI 에이전트가 사양 문서 작성부터 코드가 모든 요구사항을 충족하는지 확인하는 것까지 모든 작업을 수행하도록 신뢰할 수 있습니다. 위험: 빠른 반복 주기에서 철저한 보안 검토 없이 기능 코드가 승인됩니다. 최신 에이전트는 기본적으로 안전한 코드를 생성하는 경우가 많지만 '항상' 그런 것은 아니며 누적된 취약점은 수동 검토를 통해 누락됩니다.
이 Codelab에서는 개발 중에 CLI를 사용하여 대화형으로 (검토, 수정, PR) Antigravity를 검토자로 사용하는 방법과 SDK를 사용하여 지속적 통합에서 자동으로 (에이전트가 모든 Pull 요청을 검토하고 결과를 댓글로 게시) Antigravity를 검토자로 사용하는 두 가지 접근 방식을 가르쳐 이러한 문제를 해결합니다.
탐색할 내용
리드 CRM 앱에 바이브 코딩을 적용했습니다. AI 에이전트가 Express 백엔드, SQLite 데이터베이스, React 프런트엔드 등 전체 스택을 빌드했습니다. 작동합니다. 그런 다음 에이전트에게 리드 검색 기능과 관리자 통계를 사용한 일괄 가져오기/내보내기라는 두 가지 새로운 기능을 추가해 달라고 요청했습니다. 에이전트가 둘 다 빠르게 전달했습니다. 코드가 실행되고 기능이 작동하며 PR이 준비됩니다.
하지만 문제는 이 코드를 작성하지 않았다는 것입니다. 승인하셨습니다. 검색 엔드포인트가 SQL 삽입에 취약하지 않다는 것을 어떻게 알 수 있나요? 관리자 경로에 하드 코딩된 비밀번호가 없다는 것을 어떻게 알 수 있나요? AI 생성 코드를 한 줄씩 읽으면 애초에 바이브 코딩을 하게 된 속도 이점이 사라집니다.
이 Codelab에서는 이 문제를 해결하는 두 가지 방법을 설명합니다.
- 케이스 1 – 대화형 검토: 취약점이 있는 기능 브랜치를 체크아웃하고, 에이전트 기술로 강화된 Antigravity CLI를 사용하여 차이점을 검토하고, 문제를 수정하고, 깨끗한 PR을 만듭니다.
- 케이스 2 – 자동 검토: Antigravity SDK로 구동되는 GitHub Action을 설정하여 PR을 자동으로 검토하고, 구조화된 결과를 댓글로 게시하고, 개발자가 검토에 대한 후속 질문을 하면 답변합니다.

학습할 내용
- 바이브 코딩이 보안 위험을 야기할 수 있는 방법과 자동 검토가 수동 검토에서 놓치는 부분을 포착하는 이유
- 커뮤니티에서 관리하는 에이전트 기술을 설치하고 사용하여 Antigravity CLI에 심층적인 보안 및 코드 검토 전문 지식을 제공하는 방법
- CLI를 대화형으로 사용하여 기능 브랜치 차이를 검토하고, 취약점을 수정하고, 정리된 PR을 만드는 방법
- Antigravity SDK를 사용하여 선언적 안전 정책 및 수명 주기 후크가 있는 읽기 전용 코드 검토 에이전트를 빌드하는 방법
- PR을 검토하고 결과를 PR 주석으로 게시하는 검토 에이전트를 GitHub 작업으로 배포하는 방법
기본 요건
- Google Cloud 계정
- GitHub 계정
- 터미널, 버전 관리, CI/CD에 대한 기본적인 지식
2. 환경 설정
이 단계에서는 리드 CRM 앱 저장소를 포크하고, Cloud Shell에서 클론하고, Antigravity CLI를 설정하고, 인증합니다.
저장소 포크
GitHub Actions로 커밋을 푸시하고 PR을 생성하므로 저장소의 자체 사본이 필요합니다.
다음 저장소로 이동합니다.
그런 다음 포크를 클릭합니다. 포크 생성 페이지에서 'main 브랜치만 복사' 체크박스를 선택 해제합니다. 포크에 다른 기능 브랜치 (feature/lead-search 및 feature/bulk-operations)가 포함되어야 합니다.


Cloud Shell 열기
브라우저에서 Cloud Shell을 엽니다. Cloud Shell은 이 Codelab에 필요한 모든 도구가 사전 구성된 환경을 제공합니다. 메시지가 표시되면 승인을 클릭합니다.
그런 다음 '보기' -> '터미널'을 클릭하여 터미널을 엽니다. 인터페이스는 다음과 유사해야 합니다.

이것이 기본 인터페이스가 됩니다. 상단에 IDE, 하단에 터미널이 있습니다.
GitHub로 인증
기본적으로 Cloud Shell에는 GitHub 사용자 인증 정보가 구성되어 있지 않지만 gh CLI는 이미 설치되어 있습니다. 나중에 커밋을 푸시하고 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. 문제 - 바이브 코딩 기능에 숨겨진 취약점
다음은 시나리오입니다. 팀원이 AI 에이전트를 사용하여 리드 CRM 앱에 리드 검색 기능과 일괄 가져오기/내보내기 작업이라는 두 가지 기능을 추가했습니다. 두 기능 모두 작동합니다. 두 제품 모두 보안 검토 없이 빠르게 출시되었습니다. 병합하기 전에 두 브랜치를 검토합니다. 하나는 CLI를 사용하여 대화식으로 검토하고 다른 하나는 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" });
+ }
...
두 번째 기능 브랜치 검사
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 작업을 사용하여 자동으로 (케이스 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
다음으로 agent skills를 사용하여 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/에 스킬이 기본적으로 설치됩니다. 즉, 저장소의 일부가 되어 코드와 함께 커밋할 수 있으므로 프로젝트의 모든 개발자 (및 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 생성
이제 원하는 경우 변경사항을 자체 저장소에 푸시할 수 있습니다. 다음 사례로 넘어가기 전에 먼저 변경사항을 현재 브랜치에 커밋하겠습니다.
아직 Git ID를 구성하지 않았다면 먼저 구성해야 합니다 (자신의 이름과 이메일로 대체).
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
그런 다음 변경사항을 커밋합니다.
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 Action으로 배포하고, 두 번째 기능 브랜치에 대해 테스트합니다. 에이전트는 요청에 따라 PR을 검토하고 결과를 PR 댓글로 게시합니다.
자동 검토가 필요한 이유
개발자가 적극적으로 검토하는 경우 대화형 CLI 검토 (케이스 1)가 작동합니다. 팀은 모든 PR에서 자동으로 실행되는 검토가 필요합니다. 이를 통해 모든 기여자, 도구, 시간에서 문제를 포착할 수 있습니다. Antigravity SDK (google-antigravity)는 CLI와 동일한 에이전트 런타임을 Python 라이브러리로 제공합니다. 정책과 후크는 코드에서 구성됩니다.
GitHub Actions는 GitHub의 기본 제공 지속적 통합/지속적 개발 (CI/CD) 플랫폼입니다. PR을 열거나, 커밋을 푸시하거나, 댓글을 게시하는 등의 저장소 이벤트에 대한 응답으로 YAML에 정의된 자동화된 스크립트인 워크플로를 실행합니다. 워크플로는 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
시나리오의 두 번째 기능 브랜치입니다. 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에서 사용된 것과 동일한 보안 및 코드 검토 기술이 필요합니다. 런타임에 SDK 에이전트가 로드할 수 있도록 code_review_agent/skills/에 설치합니다.
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용)만 명시적으로 허용합니다. - 두 레이어에서 시행: 정책은 프레임워크 수준에서 제한하고
enforce_safe_tools후크는 두 번째 레이어를 제공하여run_command을 통해git명령만 허용합니다 . - Git diff 범위 지정: 에이전트가
git diff main...HEAD를 실행하여 전체 코드베이스가 아닌 변경된 코드만 검토합니다. - 대체 기능이 있는 구조화된 출력:
response_schema=ReviewResult는 SDK의 종료 도구를 통해 JSON 구조를 적용합니다. 파싱이 실패하면 대체 체인에서text()을 JSON으로 파싱한 후 원시 텍스트를 반환합니다. - 인증 대체: 사용 가능한 경우
GEMINI_API_KEY를 사용하고, 그렇지 않으면 애플리케이션 기본 사용자 인증 정보를 통해 Vertex AI로 대체됩니다. - 파일 출력: 서식이 지정된 마크다운 결과를
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 댓글로 게시합니다.
이제 모든 변경사항을 커밋하고 GitHub 원격으로 푸시하면 이 통합을 테스트할 준비가 완료됩니다.
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 요청이 생성되면 Checks 메뉴 또는 Merge pull request 버튼 근처에서 검사할 수 있는 GitHub 작업이 실행됩니다.

실행 중인 작업을 클릭하여 세부정보를 확인할 수 있으며, 완료되면 아래와 같이 검토 결과를 풀 요청 댓글로 게시합니다.

8. 마무리
수고하셨습니다.
바이브 코딩된 기능에서 보안 취약점을 포착하기 위한 두 가지 완전한 코드 검토 워크플로를 빌드했습니다.
- 케이스 1 (대화형): 에이전트 기술이 적용된 Antigravity CLI가 기능 브랜치 차이를 검토하고, SQL 삽입 및 기타 취약점을 식별하고, OWASP 패턴에 따라 수정하고, 깨끗한 PR을 생성했습니다.
- 케이스 2 (자동화): Antigravity SDK는 모든 PR을 자동으로 검토하고 구조화된 보안 결과를 PR 댓글로 게시하는 GitHub 작업을 지원했습니다.
학습한 내용
- 바이브 코딩이 보안 위험을 야기하는 방식과 자동 검토가 수동 검토에서 놓치는 부분을 포착하는 이유
- 에이전트 기술을 설치하고 사용하여 Antigravity CLI에 구조화된 보안 전문 지식을 제공하는 방법
- 기능 브랜치 차이점을 대화형으로 검토하고, 문제를 수정하고, 깨끗한 PR을 만드는 방법
- 기본적으로 거부 정책과 수명 주기 후크를 사용하여 Antigravity SDK로 읽기 전용 검토 에이전트를 빌드하는 방법
- 대화형 후속 조치 지원을 통해 자동 검토 파이프라인을 GitHub Action으로 배포하는 방법
정리
PR 닫기
GitHub의 포크에서 각 pull 요청으로 이동하여 Close pull request(pull 요청 닫기)를 클릭합니다. feature/bulk-operations PR을 병합하지 마세요. 패치가 적용되지 않은 취약한 코드가 아직 포함되어 있습니다.
포크된 저장소 삭제 (선택사항)
포크가 더 이상 필요하지 않으면 GitHub에서 포크로 이동하여 설정 -> 위험 영역으로 스크롤 -> 이 저장소 삭제를 클릭합니다.
다음 단계
- Antigravity CLI 플러그인 및 스킬: 맞춤 스킬 및 플러그인 만들기
- Antigravity CLI 권한 및 샌드박스 - 세분화된 도구 정책 및 OS 수준 샌드박스
- Antigravity SDK 후크 및 정책 - 고급 패턴 (속도 제한, 오류 복구, 미들웨어)
- Antigravity SDK 예시 - 프로덕션 패턴의
agent_middleware.py