← 전체 글

터미널의 역습: Rust와 Go로 에이전트 루프를 크로스 플랫폼으로

Agent! 는 Mac 앱이지만, 코딩 에이전트는 개발자가 일하는 모든 곳에 있어야 합니다. 에이전트 루프가 어떻게 Rust와 Go로 된 두 개의 CLI가 되었고, macOS, Windows, Linux에서 전체 화면 TUI를 갖추게 되었는지 소개합니다.

Agent! 는 지금까지 대부분의 시간 동안 자랑스러운 Mac 앱이었습니다. 네이티브 Swift와 SwiftUI, AppleScript 및 Accessibility와의 깊은 연동, 그리고 root 권한을 위한 Launch Daemon까지 갖추고 있죠. 이것은 여전히 플래그십입니다. 하지만 지난 며칠 사이 코딩 에이전트에 대한 우리의 생각에 변화가 생겼고, 오늘 그 결과를 출시합니다.

이제 에이전트 루프가 macOS, Windows, Linux의 터미널에서 실행됩니다. 기능이 동일한 두 가지 에디션으로 제공됩니다. Rust로 작성된 AgentiLoopCLI와 Go로 작성된 AgentiLoopGo입니다. 그리고 맞습니다, 이 작은 동생들의 상당 부분은 Mac용 Agent! 가 직접 작성했습니다.

패러다임의 전환: 다시 터미널로

AI 코딩 도구의 첫 번째 물결은 에디터와 채팅 창 안에 있었습니다. 지금 승리하고 있는 물결은 터미널 에 있습니다. 여기에는 그럴 만한 이유가 있습니다.

  • 작업은 이미 터미널에서 이루어지고 있습니다. 빌드, 테스트, git, 패키지 매니저, SSH 세션이 모두 그곳에 있습니다. 터미널 속 에이전트는 각각에 대한 연동이 필요 없습니다. bash가 있으니까요.
  • 어디서든 동작합니다. CLI는 Linux 빌드 서버, 컨테이너 내부, Raspberry Pi의 SSH 세션, Windows 개발용 VM에서도 실행됩니다. Mac 앱은 Mac에서만 실행됩니다.
  • 조합이 자유롭습니다. 원샷 모드(agentiloop "explain this project")는 스크립트와 CI에 바로 넣을 수 있습니다.
  • 무엇을 하는지 투명하게 보여줍니다. 모든 도구 호출, diff, 권한 요청이 일반 텍스트로 화면에 흘러갑니다.

Accessibility로 Photo Booth를 조작하거나 ScriptingBridge로 Mail을 스크립팅하는 것 같은 Mac 앱의 초능력은 정말로 Mac 전용입니다. 하지만 에이전트 루프 는 그렇지 않습니다. 추론하고, 도구를 호출하고, 실제 결과를 읽고, 수정하고, 반복하는 것. 이는 셸과 파일 시스템이 있는 모든 OS에서 동작합니다. 그래서 우리는 루프를 떼어냈습니다.

왜 두 가지 언어인가?

하나만 고를 수도 있었습니다. 대신 우리는 의도적으로 같은 설계를 두 번 이식했습니다.

Rust (AgentiLoopCLI) 가 먼저였습니다. 워크스페이스는 9월 20일에 핵심 루프, Anthropic 프로바이더, 내장 도구, CLI와 함께 뼈대가 만들어졌습니다. 다섯 개의 크레이트로 나뉘어 있습니다. agentiloop-core(루프, 메시지, 세션, 권한), agentiloop-provider, agentiloop-tools, agentiloop-mcp, agentiloop-cli입니다. tokio 위에서 동작하고, reqwest를 rustls와 함께 사용해 Windows에서 OpenSSL과 씨름할 필요가 없으며, TUI는 ratatui로 그립니다. Markdown은 pulldown-cmark로 처리하고, 코드 구문 강조는 syntect가 담당합니다.

Go (AgentiLoopGo) 는 9월 23일 연이은 커밋과 함께 등장했습니다. 테스트를 갖춘 코어(메시지, 에이전트 루프, 컨텍스트 압축, 세션, 권한), 이어서 프로바이더, 그다음 MCP 클라이언트, 그리고 REPL, TUI, Markdown, 구문 강조, 세션, 슬래시 명령을 갖춘 CLI 순이었습니다. TUI는 tcell로 그리고, Markdown은 goldmark로 렌더링하며, 강조는 chroma로, 줄 편집은 liner로 처리합니다. 릴리스 워크플로는 Rust 에디션과 같은 다섯 개 플랫폼을 대상으로 합니다.

두 번 만드는 것은 최고의 설계 리뷰입니다. 사실은 Rust만의 방식이거나 Go만의 방식이었던 것들이 즉시 드러나고, 남는 것이 진짜 아키텍처입니다. 실용적인 이점도 있습니다. 여러분의 팀이 이미 신뢰하는 툴체인을 고르면 됩니다. 그리고 어느 쪽이 더 잘하는지 알려주세요. 🦀 vs 🐹

같은 루프, 더 작은 표면

두 CLI 모두 의도적으로 작지만 날카로운 도구 세트로 시작합니다.

도구하는 일먼저 묻나요?
read_file줄 번호와 함께 파일을 읽습니다아니요
list_dir폴더 내용을 나열합니다아니요
write_file파일을 생성하거나 덮어씁니다예
edit_file정확히 일치하는 텍스트 조각을 교체합니다예
bash명령을 실행합니다(Mac과 Linux에서는 sh -c, Windows에서는 cmd /C)예

더 필요하신가요? 두 에디션 모두 Agent! 자체의 AgentMCP에서 이식한 MCP 클라이언트를 포함하고 있으며, stdio, Streamable HTTP, 레거시 HTTP+SSE를 지원하므로 어떤 MCP 서버의 도구든 바로 연결됩니다.

권한은 UI에 덧붙인 것이 아니라 코어의 일부입니다. Rust에서는 PermissionPolicy 트레이트가 도구 이름, 변경을 일으키는지 여부, 입력값을 바탕으로 각 호출의 실행 여부를 결정합니다. 응답은 Allow, Deny, Cancel 중 하나입니다. 세 번째 옵션은 실제로 겪은 불편함 때문에 생겼습니다. 권한 요청에서 Esc 를 누르면 전체 작업이 끝나는 것이 아니라 해당 호출 하나만 건너뛰어야 하니까요. CLI는 대화형 정책을 제공하고, 테스트와 CI는 AllowAll을 사용합니다.

크로스 플랫폼은 디테일에 있다

"Windows에서 실행됩니다"라고 말하기는 쉽지만 제대로 해내기는 어렵습니다. 이를 위해 필요했던 몇 가지는 다음과 같습니다.

  • 폭주하는 명령을 확실히 종료하기. bash가 시간 초과되었을 때, 셸이 자식 프로세스를 생성했다면 셸만 종료하는 것으로는 충분하지 않습니다. Go 에디션은 전체 프로세스 트리를 종료합니다. Unix에서는 프로세스 그룹을, Windows에서는 taskkill /T를 사용합니다. 코드는 proc_unix.go와 proc_windows.go로 나뉘어 있습니다.
  • 세 가지 OS 모두에서 CI. Go 저장소는 macOS, Linux, Windows에서 CI를 실행하고, Rust 릴리스 워크플로는 다섯 개의 바이너리를 빌드합니다. macOS arm64와 x86_64, Linux x86_64와 arm64, 그리고 Windows x86_64입니다.
  • 서명된 Mac 바이너리. 릴리스 워크플로는 macOS 빌드에 서명하고 공증할 수 있어 Gatekeeper가 차단하지 않습니다.
  • 설정 파일 발굴 작업은 이제 그만. CLI는 여러분이 어떻게 실행했는지, 즉 프로바이더, 모델, TUI 모드, 세션을 기억합니다. 첫 실행 이후에는 그냥 agentiloop만 입력해도 마지막으로 멈춘 곳에서 정확히 이어집니다.

앱처럼 느껴지는 TUI

실행 방법은 세 가지입니다. 전체 화면 TUI (agentiloop --tui), 단순한 터미널을 위한 줄 단위 채팅 모드, 그리고 스크립트를 위한 원샷 모드입니다. TUI는 지난 며칠간 바쁘게 발전했습니다.

  • 프롬프트 박스 안의 애니메이션 작업 표시기(스피너, 현재 작업, 경과 시간 포함)
  • 초당 토큰 수 추적
  • 클릭 가능한 링크
  • 실행 간에 유지되는 프롬프트 기록
  • 이전 대화를 보여주는 세션 재개 기능으로 빈 화면을 멍하니 바라볼 필요 없음
  • 프로바이더의 실시간 모델 목록을 기반으로 하는 /model

그리고 API 키가 없거나 잘못된 경우, 401 오류를 그대로 쏟아내는 대신 쉬운 말로 알려주고 실제 프로바이더 이름을 명시합니다.

프로바이더

첫날부터 Claude(API 키 또는 Claude Code OAuth 토큰을 같은 자격 증명 항목에 넣으면 인증 방식을 자동 감지), OpenAI 및 모든 OpenAI 호환 서버, Ollama 또는 LM Studio를 통한 로컬 모델, 그리고 Apple Silicon의 oMLX 와 함께 동작합니다. oMLX의 주소와 키는 ~/.omlx/settings.json에서 자동으로 읽어옵니다.

정식 릴리스를 사용해 보세요

오늘 우리는 v0.0.4 정식 릴리스를 공개했습니다. 아직 초기 단계이고 빠르게 변하고 있으며, 변경 비용이 적은 지금 여러분의 피드백을 받고 싶습니다. Rust 릴리스에서 바이너리를 받거나, 소스에서 Go 에디션을 빌드하세요.

Mac 앱은 어디로도 가지 않습니다. Mac을 사용 중이라면 Agent! 는 여전히 어떤 터미널도 할 수 없는 일들을 해냅니다. 하지만 Linux 서버, Windows 노트북, Raspberry Pi에서도 같은 에이전트를 쓰고 싶었던 적이 있다면, 이제 여기 있습니다.