앱·CLI
이 인덱스에는 이름이 같은 goose가 둘 있습니다. 이 문서는 45.2k★ AI 에이전트 goose(aaif-goose/goose)를 다룹니다. WHOOP 5.0 밴드용 건강 앱인 b-nnett/goose는 별도 문서(goose-deep-dive.html)에서 다뤘습니다. 깃허브에서 레포 이름은 얼마든지 겹칠 수 있으니, 항상 owner/repo 풀네임으로 확인하는 습관이 좋습니다.
"클라우드가 아니라 내 컴퓨터에서 직접 돌면서, 코드 작성부터 자료 조사·문서 작업·자동화까지 시켜먹을 수 있는 오픈소스 AI 에이전트"입니다. AI 에이전트란 단순히 질문에 답하는 챗봇이 아니라, 파일을 읽고·명령을 실행하고·도구를 골라 쓰면서 여러 단계의 작업을 스스로 진행하는 프로그램을 말합니다. goose는 그 에이전트를 macOS·Linux·Windows용 데스크탑 앱, 터미널 CLI, 그리고 어디에든 심을 수 있는 API 서버, 세 형태로 제공합니다.
가장 큰 특징은 "특정 회사에 묶이지 않는다"는 점입니다. Anthropic·OpenAI·Google·Ollama 등 15개 이상의 프로바이더를 API 키로 붙일 수 있고, 심지어 이미 결제 중인 Claude·ChatGPT·Gemini 구독을 ACP라는 프로토콜로 끌어와 쓸 수도 있습니다. 2026년 Block에서 Linux Foundation 산하 AAIF로 이관되면서 "한 회사의 제품"이 아니라 공공 인프라 성격의 에이전트 플랫폼으로 자리를 굳히는 중입니다.
통신사 약정폰은 그 통신사에서만 쓸 수 있지만, 자급제 폰은 아무 유심이나 꽂으면 됩니다. goose가 바로 자급제 폰입니다 — 본체(에이전트 루프·도구·UI)는 goose가 제공하고, 두뇌(LLM)는 Anthropic이든 OpenAI든 내 PC의 Ollama든 마음대로 꽂아 씁니다.
여기에 더해 "이미 쓰는 요금제(Claude·ChatGPT 구독)를 그대로 연결"하는 ACP까지 지원하니, 두뇌 선택의 자유가 이 프로젝트의 정체성입니다.
rmcp로 구현했다.goose가 다시 트렌딩에 오른 직접적 계기는 Linux Foundation 산하 AAIF(Agentic AI Foundation)로의 이관입니다. README 첫 줄에 "block/goose에서 이사했다"는 공지가 붙어 있을 만큼 최근 일입니다. 한 기업(Block)의 사이드 프로젝트에서 쿠버네티스처럼 재단이 관리하는 중립 오픈소스로 격이 바뀐 것인데, 기업 입장에선 "벤더 종속 없이 도입할 수 있는 에이전트"라는 신뢰 신호가 됩니다.
두 번째 이유는 구독 재사용(ACP)입니다. 에이전트를 쓰려면 보통 API 키를 새로 발급받아 토큰당 비용을 내야 하는데, goose는 이미 결제 중인 Claude·ChatGPT·Gemini 구독을 ACP로 연결해 쓰는 길을 열었습니다. 개인 개발자에게는 기존 계정의 지원 경로로 데스크톱 에이전트를 연결하는 매력적인 선택지입니다.
| 도구 | 성격 | goose와의 차이 |
|---|---|---|
| Claude Code | Anthropic의 코딩 CLI 에이전트 | Claude 전용·터미널 중심. goose는 멀티 프로바이더 + 데스크탑 앱이 기본 |
| OpenHands | 오픈소스 코딩 에이전트(웹 UI) | 코딩 작업 특화. goose는 코딩 외 리서치·문서·자동화까지 범용 지향 |
| goose | 로컬 우선 범용 에이전트 | 데스크탑+CLI+API 서버 3면 제공, Rust 코어, 재단(AAIF) 거버넌스 |
코딩 에이전트 경쟁이 워낙 뜨겁다 보니 goose도 "또 하나의 코딩 CLI"로 오해받기 쉽다. 하지만 goose의 공식 소개 첫 문장은 "Not just for code"다. 스케줄러(예약 실행), recipe(작업 패키지), 메모리·튜토리얼 같은 내장 확장 구성을 보면 일상 업무 자동화 플랫폼을 목표로 설계됐음이 드러난다.
이 관점으로 보면 왜 데스크탑 앱(Electron)에 공을 들이는지, 왜 여러 프로바이더를 연결하는지, 왜 recipe로 "에이전트 구성 공유"를 만들었는지가 한 줄로 꿰어진다. 비개발자 동료에게 "이 recipe 딥링크 눌러" 하고 건네는 시나리오까지 포함한 설계다.
2026-10-31 고정 소스의 workspace는 1.57.0이며 Rust edition 2021·최소 rust-version 1.94.1을 선언한다. rust-toolchain.toml은 실제 개발 도구 체인 1.99.0을 선택한다. UI manifest도 1.57.0, Node ^24.10.0·pnpm ≥10.30.0이다. 설치 바이너리 사용과 소스 개발의 요구사항은 구분한다.
| 층 | 현재 경로·역할 |
|---|---|
| 실행 코어 | goose-agent: 상태 머신·추론·도구·효과 |
| 통합 기능 | goose: provider·session·MCP·ACP·recipe·gateway |
| 명령 | goose-cli: goose 바이너리와 기능 플래그 |
| 공통 계층 | goose-provider-types·goose-providers·goose-context-management |
| UI | Electron·React, ui/goose-acp-client의 TypeScript ACP 클라이언트 |
루트 rmcp는 3.4.1, agent-client-protocol은 2.2.0이다. 선택 기능과 배포 방식에 따라 사용할 수 있는 도구가 달라지므로 단순 폴더 수나 모든 provider의 기능 동등성을 보장하는 숫자로 설명하지 않는다.
기존 초판의 별도 goose-server crate·goosed 중심 설명은 현재 tree와 다르다. 데스크톱 gooseServe.ts는 goose 바이너리를 찾아 serve 인자로 실행하고 준비 상태를 기다린다. 로컬 접속 URL은 ACP WebSocket과 토큰을 포함하며 로그용 주소는 따로 가린다. 자식 프로세스 수명·실패 진단·인증과 대화 규약을 함께 읽는 구조다.
goose-agent의 StateMachine은 Step::Operation과 Step::Inference를 구분한다. 각 operation이 도구·프롬프트 기여를 모으고 중복 도구 이름은 오류로 처리한다. 취소 신호는 tokio::select!로 실행과 경쟁하며, 중단된 미완료 도구 요청은 응답과 연결할 수 있도록 별도로 처리한다.
// machine.rs를 읽기 위한 개념 축약
for step in steps {
if cancelled { return Cancelled; }
match step { Operation(op) => run(op), Inference(model) => infer(model) }
}
효과와 추론을 나눈 것은 모델 호출 없이 순수 상태 규칙을 검토하기 쉽게 한다. 이 문서에서는 설치·모델·MCP 실행을 수행하지 않았다.
읽는 순서는 workspace manifest → goose-agent/src/machine.rs → ui/desktop/src/gooseServe.ts → goose-cli/Cargo.toml이다. UI는 별도 프로세스를 쓰지만 초판의 goosed.ts 경로는 현재 존재하지 않는다. core와 어댑터가 어떻게 나뉘는지 파일의 존재부터 확인한다.
여러 crate가 "코어 라이브러리 / CLI / 서버 / SDK"로 책임을 나눠 갖고, 의존성 버전은 루트의 [workspace.dependencies] 한 곳에서 관리됩니다. 실습: 작은 Rust 프로젝트를 lib + cli + server 3-crate 워크스페이스로 쪼개고, 공통 의존성을 workspace로 끌어올려 보기.
Provider trait로 여러 LLM 서비스를 갈아끼우는 구조는 전략 패턴(Strategy Pattern)의 대규모 실전 사례입니다. 실습: "텍스트 요약기" trait를 정의하고 OpenAI 호환 API용 구현과 로컬 더미 구현 두 개를 만들어, 런타임에 골라 쓰는 미니 레지스트리 작성하기.
goose는 MCP(도구 연결)와 ACP(에이전트 간 대화)를 모두 1급으로 구현한 드문 레포입니다. 특히 ExtensionConfig enum이 stdio·HTTP 스트리밍·내장·인라인 파이썬 등 7가지 연결 방식을 하나의 타입으로 다루는 부분이 교재감입니다. 실습: rmcp(Rust)나 공식 Python SDK로 "오늘 날씨를 알려주는" MCP 서버를 만들어 goose에 stdio 확장으로 연결해 보기.
FFI 대신 자식 프로세스 + HTTP를 택한 trade-off(결합도↓ vs 프로세스 관리 비용↑)를 ui/desktop/src/gooseServe.ts에서 직접 확인할 수 있습니다. 실습: 아무 언어로 짠 로컬 HTTP 서버를 Electron(또는 Tauri)에서 spawn하고, 종료 시 자식 프로세스를 깨끗이 정리하는 수명주기 코드 작성하기.
Rust 규약 → ACP → TypeScript 클라이언트로 이어지는 단일 진실원 파이프라인은 어떤 풀스택 프로젝트에도 이식 가능한 패턴입니다. 실습: FastAPI나 axum+utoipa로 작은 API를 만들고, 그 OpenAPI 스펙에서 프론트엔드 클라이언트를 자동 생성해 수동 fetch 코드와 비교하기.
| 목적 | 확인한 조건 |
|---|---|
| 배포 앱·CLI 사용 | README의 macOS·Linux·Windows 설치 안내와 선택 provider 인증 |
| Rust 소스 개발 | workspace 최소1.94.1; 저장소 toolchain1.99.0 |
| UI 개발 | Node ^24.10.0·pnpm ≥10.30.0 |
| 모델 연결 | API·로컬 모델·ACP 경로에 따른 계정과 런타임 조건 |
범용 에이전트가 로컬에서 실행된다는 말은 모델이 항상 로컬에서 처리된다는 뜻이 아니다. provider별 데이터 전송·접근 범위와 도구 승인을 확인한다. 구독 연결은 지원 경로이며 무제한 사용이나 모든 작업의 추가 비용 0원을 보장하지 않는다. 정확한 RAM·디스크 최소값은 이 조사에서 확인하지 못했다.
데스크탑 앱을 설치하고 프로바이더 하나를 연결한 뒤, "이 폴더의 파일들을 정리해 README 초안을 써줘" 같은 멀티스텝 작업을 시켜 본다. 에이전트가 도구를 고르고 반복하는 과정을 화면에서 관찰하며 4장의 흐름도와 대조하기.
workflow_recipes/의 YAML 레시피 하나를 열어 instructions·extensions·파라미터가 어떻게 선언되는지 분석하고, 내 업무 하나(예: 주간 보고 초안)를 recipe로 작성해 goose recipe validate로 검증해 본다.
Python 공식 MCP SDK로 도구 1개짜리 MCP 서버(예: 사내 위키 검색 흉내)를 만들고, goose에 stdio 확장으로 등록해 에이전트가 실제로 호출하게 만든다. 어떤 스키마를 줘야 LLM이 도구를 "잘 고르는지" 설명문을 다듬어 보기.
crates/goose-providers/src/declarative/의 JSON 하나를 본떠, OpenAI 호환 API를 제공하는 다른 서비스(또는 로컬 vLLM)를 코드 수정 없이 JSON만으로 등록해 본다. "쉬운 확장 경로"가 어떻게 설계됐는지 체감하는 과제.
agents/agent.rs의 reply() → reply_internal()을 읽고, max_turns·컨텍스트 압축·도구 호출 분기를 포함한 상태 다이어그램을 직접 그린다. tokio::select!로 알림과 결과를 한 스트림에 합치는 tool_stream()까지 따라가면 비동기 Rust 실전 독해 완성.
아무 언어로 "LLM 호출 → 도구 호출 파싱 → 실행 → 결과 재투입"을 도는 100줄짜리 에이전트 루프를 짜 본다. goose가 왜 스트리밍 우선 trait·이벤트 enum·세션 영속화를 뒀는지, 직접 만들며 결핍으로 배우는 과제.
| 주차 | 학습 주제 | 실천 목표 |
|---|---|---|
| 1주차 | 에이전트 개념·goose 사용 | 데스크탑+CLI 설치, 프로바이더 연결, 멀티스텝 작업 5개 실행 |
| 2주차 | MCP 표준 | MCP 스펙 읽기, 도구 1개짜리 서버 제작·연결 |
| 3주차 | 비동기 Rust 기초 | tokio·async-stream 튜토리얼, 작은 스트리밍 CLI 작성 |
| 4주차 | goose 코어 정독 | agent.rs·providers/base.rs·extension_manager.rs 독해·도식화 |
| 5주차 | axum 서버 패턴 | SSE 스트리밍 엔드포인트 + utoipa OpenAPI 생성 실습 |
| 6주차 | Electron 사이드카 | 웹 UI + 네이티브 백엔드 프로세스 관리 미니앱 |
| 7주차 | ACP·에이전트 상호운용 | goose acp 모드 실험, 에디터(Zed 등)와 연결 구조 이해 |
| 8주차 | 나만의 에이전트 | recipe+MCP 확장 조합으로 실제 업무 자동화 1건 완성 |
현재 정본: SHA 6ec4e9a의 README·Cargo.toml·rust-toolchain.toml·ui/desktop/package.json·gooseServe.ts·crates/goose-agent/src/machine.rs. 초판 수치와 1.37.0 분석 범위는 당시 기록입니다.
| 링크 | 설명 |
|---|---|
| GitHub 저장소 | 소스 전체. Justfile·crates/goose/가 출발점 |
| 공식 Quickstart | 설치·첫 실행 가이드 |
| ACP 프로바이더 가이드 | Claude/ChatGPT/Gemini 구독 연결 방법 |
| AAIF (Agentic AI Foundation) | goose가 속한 Linux Foundation 산하 재단 |
| MCP 공식 사이트 | 도구 연결 표준 스펙·SDK |
| GOVERNANCE.md | 재단 이관 후의 프로젝트 운영 구조 |
| CUSTOM_DISTROS.md | 나만의 goose 배포판 만들기(프로바이더·브랜딩 프리셋) |