글 목록Read in English

Antigravity + Gemini 3.7 Flash 로 AI 서비스 감시하는 맥북 앱 바이브코딩하기

내 AI가 죽어버림 ...

요즘 LLM 제공업체들이 자주 죽습니다. 저만 그런가 싶었는데 아니더라고요. 클로드 코드를 켜고 한참 뭔가 안 되길래 뒤늦게 status.claude.com에 들어가보면, 이미 몇 분 전부터 장애였던 적이 여러 번이었어요. 한창 작업중일 때에 그것만큼 빡치는 일이 없습니다. API Error, 529 Overloaded ... 적은 돈 내는 것도 아닌데 말이죠.

그러다 문득 이런 생각이 들었습니다. 클로드 코드를 켜기 전에 맥북 화면 어딘가에 LLM 업체들 상태 페이지를 미리 가져와서 보여주는 게 있으면 어떨까. 화면 위쪽에 떠 있는 창(이걸 뭐라고 부르는지도 잘 몰랐는데, 상태창 정도로 부르겠습니다) 같은 거 말예요. 창 위에 클릭해보면, 제가 구독중인 AI들 상태랑 장애 상태들이 뜨는 거죠. 전 여러 AI를 구독하고 있으니, 그 중에서 장애 안 난 AI를 사용하면 좋지 않을까, 싶었습니다.

바이브코딩으로 해봅시다. 저의 느낌대로요.

저는 맥북 앱 개발에 대해 거의 모릅니다.

저는 태생을(?) 백엔드 개발자로 살아왔습니다. 학교 전공 시 팀 프로젝트를 할 때에도, 동아리에서 사이드 프로젝트로 창업경진대회를 나갈 때도, 지금도, 프리랜서 외주를 뛸 때도 항상 백엔드 개발자를 자처해왔고 클라이언트 개발은 거의 하질 못했죠. 최근에서야 React, Next.js, 와 같은 클라이언트 개발을 AI와 함께 하게 된 수준입니다. 맥북 앱은 더하죠. 스물 두 살에 박스오피스 ios 앱을 하나 만들어 본 것이 다입니다. 글을 쓰는 저도, 코딩을 좀 해봤다 하는 저도, 여러분과 다를 게 없어요. 어쩌면 클라이언트 사이드 개발은 여러분이 더 잘할 지 모릅니다.

하지만, AI는 그걸 부순다고 봤습니다. 여전히 저는 AI는 trash-in -> trash out 이라고 보지만, 어쩌겠어요. 쓰레기인지 아닌지는 만들어봐야 아는 겁니다. 시작해 보죠!

코딩 에이전트로 Antigravity 를 사용하겠습니다.

안티그래비티 CLI 는 이 공식 페이지에서 설치 가능합니다: https://antigravity.google/product/antigravity-cli

Antigravity CLI 공식 페이지. 가운데에 Install 버튼이 있습니다

만약 들어가기 귀찮으시다면 ... 맥북을 쓰고 계시다면.

curl -fsSL https://antigravity.google/cli/install.sh | bash

요 명령어를 사용하세요. 저도 설치되어 있긴 했는데, 이 블로그를 위해 삭제 후 재설치 해 보겠습니다. 그것이.. 작성자의 책임이니까요. 아래와 같은 화면이 보여지면 성공입니다.

설치 스크립트가 끝나고 'Antigravity CLI installed successfully' 와 'Run agy to start the CLI' 가 뜬 터미널

그리고, 우리가 작업할 폴더 디렉토리 하나를 만들어서, 그쪽으로 들어갑시다. 저는 간단하게 앱 이름을 'getstatus' 로 정했습니다.

mkdir getstatus # 이거 입력 후 엔터 치세요.
cd getstatus # 이거 입력 후 엔터 치세요.

위의 명령어를 수행하고 나면, 아래와 같이 pwd 명령어를 사용했을 때 현재 디렉토리가 getstatus인 것을 확인할 수 있을 겁니다.

mkdir, cd, pwd 를 차례로 실행해 현재 위치가 getstatus 폴더로 바뀐 터미널

거의 다 왔어요.

이제 안티그래비티, 켜 봅시다.

그냥, 터미널에 agy를 입력하세요.

터미널에 agy 라고만 입력한 화면

아래와 같은 화면이 뜰 겁니다.

Antigravity CLI 1.1.19 시작 화면. 계정과 Gemini 3.7 Flash 모델, 현재 폴더가 표시됩니다

이 화면에서 '로그인하라' 는 안내가 뜰 수 있습니다. 브라우저 창을 켜서, 로그인 해 주시면 됩니다.

좋아요. 이제 /exit을 눌러서 안티그래비티 cli 를 끄고,

입력창에 /exit 을 치자 'Exit the CLI' 자동완성이 뜬 화면

아래의 명령어를 입력해 tuckit 플러그인을 설치해주세요.

agy plugin install https://github.com/tuck-it/tuckit-plugins/tree/main/plugins/antigravity
터미널에 agy plugin install 명령어를 붙여넣은 화면

엔터를 누르면, 아래와 같이 설치가 잘 될 겁니다.

플러그인 설치 결과. tuckit 옆에 [ok] 가 뜨고 skills 16개, mcpServers 1개, hooks 2개가 처리되었다고 나옵니다

참 쉽죠? 터미널에 입력하고 명령어 보고 이거 별거 아닙니다. 그냥 자기 의도를 컴퓨터에 말하는 것 뿐이에요, 컴퓨터가 알아들을 수 있는 언어로. 까만 창에 해커들이 쓸 것 같은 글씨가 무서워 보여서 그렇죠.

이제 다시 agy를 입력해서 터미널을 켜 주세요. 그리고 /mcp를 입력해보세요.

입력창에 /mcp 를 치자 'Manage MCP servers' 자동완성이 뜬 화면
MCP Servers 목록. tuckit 옆에 빨간 X 와 'Unauthorized [Auth Needed]' 가 떠 있습니다

뭔가 X 표시가 뜨죠. 별거 아니에요, 전혀. 화살표 방향키로 tuckit을 선택하고 엔터 키를 눌러 보세요. 그리고 authenticate 를 눌러주세요.

tuckit 줄 아래에 Restart, Disable, Authenticate 세 가지 동작이 펼쳐진 화면

그러면, 아래와 같은 브라우저 화면이 뜰 겁니다. 회원가입을 진행해 주세요. 저는 개발자답게, Github 으로 진행하겠습니다.

tuckit 로그인 화면. Continue with Google, Continue with GitHub, 이메일 입력칸이 있습니다

가입하고 나면, 아래와 같은 창이 뜰 거에요. 이제 여러분들이 쓰는 에이전트가 읽고 쓸 프로젝트 공간을 생성해 보죠. 워크스페이스 선택 칸에서 '+ Create a new workspace' 를 고르고,

Authorize Google Antigravity 화면에서 워크스페이스 목록을 펼쳐 '+ Create a new workspace' 를 고르는 모습

이름을 지어 주면 됩니다. 저는 getstatus라는 이름으로 하나 만들겠습니다.

워크스페이스 이름 칸에 getstatus 를 입력하고 Allow 버튼을 누르기 직전인 화면

allow를 누르면, 이런 코드가 뜰 겁니다. 이 코드를 agy 창에 붙여넣고, 자신있게 엔터를 누릅시다.

Google Antigravity 페이지가 'Paste this code into your application to complete authentication' 이라며 인증 코드를 보여주는 화면
터미널에 'Authentication successful!' 이 뜬 화면

이제, 안티그래비티는 tuckit 의 도구를 사용할 수 있는 상태가 되었습니다!

MCP Servers 목록에서 tuckit 이 [Authed] 로 바뀌고 get_project_state, list_areas, create_area 등 도구 이름이 나열된 화면

tuckit 과 함께 개발 시작하기

쓸 수 있는 도구들, 스킬들 모두 준비되었으니 한번 실행해 보죠. AI를 잘 쓰는 방법을 많이 찾으시고, 고민하시지만 제 생각에 AI를 잘 쓰는 방법은 토큰을 태워보는 겁니다. 아래 의도를 입력해 보세요.

/tuckit:starting-with-tuckit 내가 구독하는 ai 서비스의 서버가 요즘 자꾸 죽어서, status.claude.com 같은 status 페이지를 읽어서 맥북의 상단에 띄워주는 프로그램을 만들고 싶어. claude, gemini, openai 서비스의 status 페이지를 지원해서 보여줄 수 있어야 해.
agy 입력창에 /tuckit:starting-with-tuckit 로 시작하는 긴 요청을 적어 넣은 화면

좋아요, 엔터를 누릅시다. 그리고, 팔짱을 끼고 마치 천재 개발자가 조수를 굴리는 것마냥 화면을 바라봐주세요. 바이브코딩 할 때, 특히 카페에서 코딩할 땐 이 자세가 중요합니다.

에이전트가 보드가 비어 있음을 확인하고 'AI Status Monitor' 라는 Area 하나와 Slice 하나를 만들자고 제안하는 화면

AI가 '네가 만드려는 거 뭔지 알겠고, 모니터링 하는 앱이라는 책임 영역을 하나 만들고, 착수할 작업을 보드에 올리고 시작하자!' 라고 말하네요.

Tip: Area 는 우리가 프로젝트를 진행하며 계속 관리해 나가야 하는 반영구적인 영역입니다. 가령 백엔드, 프론트엔드, 앱 같이 분리될 수 있습니다. Area 를 작게 시작해서 프로젝트가 커지고, 직원이 생기고, 분리되어 관리되어야 할 때 분리를 고려하세요.

좋아요, 의도한 대로 진행합시다. AI 에게 아래와 같이 말해보세요.

응, 그렇게 시작하자. 보드에 반영하고, 진행하자.

그러면, 안티그래비티가 여러분에게 'tuckit 에 이 도구 사용할 건데 허락해줘!' 라고 물어볼 겁니다. yes 를 누르시고,

tuckit/create_area 도구를 써도 되는지 묻는 허용 화면

app.tuckit.dev/에 들어가 보세요.

tuckit 홈 화면. '내 차례' 에 방금 만들어진 슬라이스가, 그 아래에 에이전트가 Area 와 Slice 를 만들었다는 기록이 남아 있습니다

에이전트가 영역을 생성한 것이 보이시죠? 위의 사진과 같이 슬라이스도 작성된 것이 보입니다.

AI Status Monitor 영역 보드. NEEDS DESIGN 칸에 GET-1 카드가 하나 놓여 있습니다

이제 에이전트가 사용자에게 브레인스토밍을 제안할 거에요. 허용을 눌러 보죠!

tuckit/propose 도구를 써도 되는지 묻는 허용 화면
웹 화면의 DECISIONS 칸. '메뉴바 앱 구현 기술 스택 선택' 아래에 Swift, Tauri, Python 세 가지 선택지가 놓여 있습니다
같은 질문을 터미널에서 보여주는 화면. 세 가지 기술 스택의 장단점이 정리되어 있습니다

터미널과 웹에서, AI 가 몇 가지 선택지를 제공했어요. 네이티브 Swift를 사용할 건지, 다른 기술스택들을 사용할 건지 물어보네요. Swift 를 선택해 봅시다.

Swift 선택지의 'Choose this' 버튼에 마우스를 올린 화면

TIP: 웹에서 선택해도, 터미널에서 선택해도 AI는 알아먹을 겁니다.

웹에서 선택하니, antigravity 가 구현을 위해서 status page 를 직접 찾아보려고 시도하네요. 허용을 해 주겠습니다.

그리고 두 번째 선택지를 줍니다. 이번에는 창의 형태와 각 ai provider 들의 상태를 어떻게 표시할지를 물어보고 있네요.

터미널에 뜬 두 번째 질문. 아이콘 하나에 팝오버를 띄우는 안과 메뉴바에 세 서비스를 항상 노출하는 안을 비교합니다
같은 질문이 웹 DECISIONS 칸에도 올라온 화면. 앞선 'Native Swift 선택' 이 이미 기록으로 남아 있습니다

가로로 많이 자리를 차지하는 것보다는, 추천하는 대로 아이콘 하나 / 클릭시 팝오버가 낫겠습니다.

이쯤에서 우측 중간에 있는 'map' 버튼을 눌러 보세요. 그러면, 지금까지 어떤 선택지가 있었고, 어떻게 선택할 수 있었는지를 확인하실 수 있을 겁니다. 팀에서 맥락을 공유할 때 적극적으로 사용해 보세요.

슬라이스 상세 화면 오른쪽에 있는 Map 버튼
결정 지도. 기술 스택 선택에서 시작해 채택된 안이 다음 질문으로 이어지는 흐름이 가로로 펼쳐져 있습니다

기다리는 동안 아래와 같이 새로운 질문을 던졌습니다. 상태를 몇 분 주기로 가져올 거고, 뭔가 잘못되면 어떻게 사용자에게 알려줄 거냐는 거죠. 추천대로, 알림을 보내준다면 정말 편할 것 같아요. 추천대로 선택해 보겠습니다.

세 번째 질문. 2분 주기 폴링에 상태가 바뀌면 macOS 알림을 보내는 안과, 알림 없이 폴링만 하는 안이 놓여 있습니다

조금 기다리니, AI가 설계가 완료되었다는 말을 하네요. 설계안을 확인해 봅시다.

터미널에 출력된 설계안. SwiftUI View, StatusManager, StatusFetcher, NotificationService 로 나뉜 구조도가 그려져 있습니다

그런데, 아이콘이 어떻게 보여야 하는지 잘 안 나온 것 같아요. 아이콘은 어떤 모양이어야 하는지 물어볼게요.

아이콘 모양을 묻는 질문과, 상태별 색과 배지를 정리해 답하며 앱 아이콘을 직접 생성해 주겠다는 에이전트의 답변

아이콘을 직접 생성할 수 있다고 하네요. 이참에 토큰좀 태워 봅시다. 진행을 부탁할게요. 이제 브레인스토밍이 완료되었으니, 이 스펙을 작성하고 그 스펙을 한 단계씩 나누어 체계적으로 진행할 차례입니다. 안티그래비티가 몇 번의 슬라이스 갱신 도구 권한 허용을 요청할 거에요. 허용을 눌러 주세요.

tuckit/update_slice 와 get_slice 도구를 써도 되는지 묻는 허용 화면

상세한 스펙을 작성해 줬네요. 인터뷰 결과를 바탕으로,

  1. 어떤 서비스의 상태를 가져올 것인지,
  2. 어떤 아키텍처로 프로그램을 만들 것인지,
  3. 에러 처리를 어떻게 할 것인지,
  4. 제약사항은 무엇인지를 적어뒀어요.
보드에 기록된 SPEC. 지원 대상 서비스와 엔드포인트, 모듈 구성, 에러 처리, 그리고 CONSTRAINTS 가 적혀 있습니다

검토 후, 진행을 부탁합시다.

'Design written to GET-1' 이라는 안내와, 바로 진행하자고 답한 화면

이제 브레인스토밍도, 스펙도 작성이 완료되었으니 그 작업을 나누어 진행할 단계입니다. 어떤 작업을 진행할 건지 에이전트가 tuckit 보드에 적을 텐데, 허용을 눌러주세요.

tuckit/add_bites 도구를 써도 되는지 묻는 허용 화면

조금 기다리면, 이 작업을 어떻게 진행할 건지가 상세하게 보드에 적혀있을 겁니다.

보드의 STEPS 칸에 다섯 개의 구현 단계가 todo 상태로 올라와 있는 화면

그리고 에이전트가 실행 방법을 물어보네요.

다섯 단계를 나열한 뒤, 서브에이전트로 나눠서 실행할지 현재 세션에서 바로 실행할지 묻는 화면

저는 여기서 2번을 택하겠습니다.

2번으로 진행하자

그러면, tuckit 스킬이 발동되어 개발이 시작될 겁니다.

에이전트가 브랜치를 만들고 첫 번째 단계를 doing 으로 바꾼 뒤 테스트부터 작성하기 시작한 화면

TIP: shift + tab 키로 'Accept Mode' 를 선택해 주시면, 매번 파일 허용을 누르는 고충을 없앨 수 있습니다.

화면 아래에 'Accept-edits mode: file edits auto-approved' 가 표시된 채로 작업이 이어지는 화면

중간중간, 웹 보드도 확인해 보세요. 에이전트가 알아서 '이 작업은 완료됐다!' 하고 남겨두었을 겁니다.

보드의 STEPS 칸. 네 단계가 done 으로 줄이 그어져 있고 마지막 하나가 doing 입니다

잠깐 기다리면, 에이전트가 남겨진 브랜치를 어떻게 처리할 건지, 작업을 어찌 마무리할 건지 물어볼 거에요. 저는 1번을 택해, 메인 브랜치에 병합되도록 하겠습니다.

테스트 8개 전부 통과와 빌드 성공을 보고한 뒤, 병합할지 PR 을 만들지 브랜치를 둘지 묻는 화면

마무리하고 나면, 알아서 보드의 상태가 'READY_TO_SHIP' 으로 변경되어 있을 거에요. 에이전트가 옮겼다는 표시도 잘 되어 있네요.

영역 보드에서 GET-1 카드가 READY TO SHIP 칸으로 옮겨져 있는 화면

그런데, 저는 실제로 에이전트의 말을 곧이곧대로 믿기보단 테스트를 직접 하고 보드에서 옮기고 싶습니다.

TIP: 보드에서 NEEDS_DESIGN, NEEDS_STEPS, IN_PROGRESS 는 자동으로 계산되어 옮겨져 사람이 잘못 상태를 업데이트할 일이 없도록 설계되었습니다. 하지만, 실제 SHIP 되는 것은 사람의 결정입니다. 이는 Tuckit 에서 의도된 것입니다.

질문을 던져 보죠:

실제로 테스트해 보려면 어떻게 해야 해?
swift run GetStatus 로 실행하는 법과 메뉴바에서 확인할 지점들을 알려주는 답변

테스트하는 방법을 알려 주네요, 그대로 해 보죠.

터미널 가득 찍힌 크래시 로그. NotificationService.requestAuthorization 에서 프로그램이 죽었습니다

실제로 AI 말만 듣고 배포 상태로 변경했다간, 팀에 큰 오해와 민폐를 끼칠 뻔 했습니다. 크래시가 났어요. AI에게 물어보고 진행합시다.

두 가지 문제가 있었고, 에러 메시지를 붙여서 진행했어요.

(에러 메시지 내용)
와 같이 오류가 발생했어.

그리고 수정 이후, 아래와 같은 앱을 만들 수 있었습니다.

맥북 메뉴바에 뜬 GetStatus 팝오버. Claude, OpenAI, Gemini 세 서비스가 모두 정상 운영 중으로 표시됩니다
'컴포넌트 보기' 를 펼친 모습. claude.ai, Claude API, Claude Code 같은 하위 서비스 상태가 하나씩 보입니다

원하던 대로 어떤 API가 터졌는지, 확인할 수 있도록 잘 구현되었네요.

이 프로젝트를 죽도록 두지 마세요.

튜토리얼 잘 따라해 보셨나요? 개인적으로 어제 바로 겪은 문제이기도 했고, 바로바로 들어가는 것이 귀찮았기 때문에 꼭 만들어보고 싶던 사이드 프로젝트였습니다.

이렇게 한번 만들어두면, 정말 아이디어가 넘쳐나게 되어요. 가령,

  1. 저는 Minimax 라는 AI 모델을 따로 구독하고 있습니다. AI 를 또 추가해보고 싶기도 해요.
  2. 이걸 사용자들이 설치할 수 있는 앱으로 만드려면 어떻게 하면 또 좋을까요?
  3. 세로로 길어지는 것이 보기 조금 불편해보이기도 해요. 레이아웃을 개선하고 싶어요.

와 같이 말입니다. 이럴 땐, 위의 내용을 모두 복사해서 아래와 같이 명령해 보세요. AI가 알아서 보드에 올려줄 겁니다.

세 가지 개선 아이디어를 그대로 붙여넣고 '이거 모두 Area 슬라이스로 올려줘' 라고 시킨 화면
에이전트가 GET-1 을 shipped 로 옮기고 GET-2, GET-3, GET-4 를 새로 만들었다고 보고하는 화면

한번 확인해 볼까요?

영역 보드의 NEEDS DESIGN 칸에 새 슬라이스 세 개가 올라와 있고, 아래에 Shipped (1) 이 보이는 화면

너무 좋아요. AI가 어떤 후속 작업을 제안하든, 우리가 뭘 원하든, 적어두고 잊지 않게 나중에 작업시켜 보면 됩니다.

슬라이스를 하나 열고, 우측 위 프롬프트 박스에서 복사하시면 더 편합니다.

'Hand to an agent' 박스. 이 슬라이스를 에이전트에게 넘길 때 쓸 프롬프트가 미리 적혀 있고 Copy 버튼이 있습니다

마치며..

이렇게, 새로운 기능을, 어떤 에이전트 혹은 몇 몇의 팀이 사용하고 있든 프로젝트를 관리할 수 있습니다.

돌아보면 오늘 제가 한 일은 거의 없습니다. 폴더 하나 만들고, 하고 싶은 걸 한 문단으로 적고, 몇 번 골라준 게 다예요. 설계도, 할 일 목록도, 완료 표시도 전부 에이전트가 적었습니다. 저는 그걸 웹에서 읽기만 했고요.

그런데 딱 한 군데, 제가 안 넘긴 자리가 있습니다. 에이전트는 '테스트 8개 전부 통과, 빌드 성공' 이라고 보고했고 보드도 알아서 READY TO SHIP 까지 갔지만, 실제로 앱을 켜 보니 켜지자마자 죽었어요. 만약 그 말만 믿고 제가 '출시 완료' 로 옮겼다면, 팀에서는 다 된 줄 알았을 겁니다. 그래서 tuckit 에서 앞의 칸들은 자동으로 계산되어 옮겨지지만, 마지막 한 칸만은 사람이 직접 누르게 되어 있습니다. 이건 불편하라고 남겨둔 게 아니라, 거기가 사람의 자리라서 남겨둔 겁니다.

그러니 오늘 만든 이 프로젝트를 죽도록 두지 마세요. 떠오른 아이디어는 머릿속이나 대화창이 아니라 보드에 두시고, 다음에 아무 에이전트나 켜서 "다음 거 하자" 라고 말해 보세요. 그 에이전트는 오늘 우리가 나눈 대화를 하나도 모르지만, 보드는 읽을 수 있습니다.

이 글은 AI를 사용해서가 아니라 손수 작성됐습니다. 아니 진짭니다.

다음에는, 제가 지금 tuckit 으로 개발하고 있는 프로그램을 가지고 와서, 프로젝트를 처음부터 어떻게 세팅하는지 보여드릴게요.