
Show HN: Zot – 또 하나의 코딩 에이전트 하네스 (coding agent harness)
요약
Zot은 Go 언어로 작성된 가볍고 독립적인 단일 바이너리 형태의 터미널 코딩 에이전트 하네스입니다. 별도의 런타임이나 Docker 없이 다양한 LLM 프로바이더와 연결하여 파일 편집, 셸 실행 등의 작업을 수행할 수 있습니다.
핵심 포인트
- Go 기반의 단일 바이너리로 설치와 실행이 매우 간편함
- Anthropic, OpenAI, DeepSeek 등 광범위한 LLM 프로바이더 지원
- TUI, stdout, JSON, RPC 등 네 가지 실행 모드 제공
- 파일 편집 및 셸 실행 등 실제 개발 워크플로우 지원
zot. 또 하나의 코딩 에이전트 하네스 (coding agent harness).
가볍습니다. 단일 바이너리 (Single binary) 형태입니다. Go 언어로 작성되었습니다 (vibe-slopped). 영원한 베타 버전입니다.
무엇이든 물어보거나, /help를 입력하여 명령어를 확인하세요.
curl -fsSL https://www.zot.sh/install.sh | bash
개요 (About)
zot은 하나의 정적 Go 바이너리로 제공되는 최소한의 터미널 코딩 에이전트입니다. 런타임 (Runtime)이 필요 없습니다. Docker도 필요 없습니다. 전용 패키지 매니저가 있는 플러그인 시스템도 없습니다. 그저 에이전트 루프 (agent loop)를 잘 구현했을 뿐입니다. $PATH에 넣고 바로 시작하세요.
Anthropic, OpenAI/Codex/Responses, Kimi, DeepSeek, Google Gemini/Vertex, GitHub Copilot, Bedrock, Azure OpenAI, OpenRouter, Groq, Cerebras, xAI, Together, Hugging Face, Mistral, Moonshot, Z.AI, Xiaomi, MiniMax, Fireworks, Vercel AI Gateway, OpenCode, Cloudflare AI, 그리고 로컬 OpenAI 호환 모델 (ollama 등)과 통신하며, 파일을 편집하고, 셸 (shell)을 실행하며, 심지어 Telegram DM에 답장까지 합니다. 본인의 API 키를 가져오거나 Claude, ChatGPT/Codex, Kimi Code, 또는 GitHub Copilot 구독으로 로그인하세요. DeepSeek와 Google은 API 키만 사용 가능합니다.
실행하는 네 가지 방법:
interactive - 스트리밍 출력, 슬래시 명령어 (slash commands), 대기열 메시지 (queued messages), 그리고 인라인 사이드 채팅 (inline side-chat)을 지원하는 전체 TUI.
print - zot -p, 단발성(one-shot)으로 최종 어시스턴트 텍스트를 표준 출력(stdout)으로 보냅니다. 셸 파이프라인 (shell pipelines)에 적합합니다.
json - zot --json, NDJSON 이벤트를 표준 출력(stdout)으로 보냅니다. 스크립트와 CI에 완벽합니다.
rpc - zot rpc, 장기 실행되는 자식 프로세스(child process)로, 표준 입력(stdin)으로 NDJSON 명령을 받고 표준 출력(stdout)으로 이벤트를 보냅니다. 어떤 언어로 작성된 앱이든 zot을 가져다 쓸 수 있습니다. 와이어 포맷 (wire format)을 확인하세요.
프로바이더 (Providers)
zot은 광범위한 프로바이더 카탈로그를 제공하므로 /login, /model, --provider, --list-models가 모두 동일한 ID를 사용합니다.
구독 가능 (Subscription-capable) - Anthropic Claude Pro/Max (anthropic), OpenAI Codex / ChatGPT Plus/Pro (openai-codex), Kimi Code (kimi), 그리고 GitHub Copilot (github-copilot)
)
직접 API 제공업체(Direct API providers) - Anthropic, OpenAI Chat Completions, OpenAI Responses, DeepSeek, Google Gemini, Kimi/Moonshot, Moonshot CN, Groq, Cerebras, xAI, Together AI, Hugging Face Router, OpenRouter, Mistral, Z.AI, Xiaomi/MiMo token-plan regions, MiniMax global/CN, Fireworks, Vercel AI Gateway, 그리고 OpenCode/OpenCode Go.
클라우드/플랫폼 제공업체(Cloud/platform providers) - Amazon Bedrock, Google Vertex AI, Azure OpenAI, Cloudflare Workers AI, 그리고 Cloudflare AI Gateway.
로컬/호환 가능(Local/compatible) - Ollama 및 --base-url을 통한 OpenAI 호환 로컬 엔드포인트
.
/login
을 사용하여 API 키 또는 구독 자격 증명을 저장합니다. 모델 선택기는 환경 변수(env vars), auth.json, Kimi CLI 폴백, 또는 로컬 Ollama를 통해 현재 사용 가능한 제공업체의 모델만 표시합니다.
구독 로그인에 대한 참고 사항. 사용되는 OAuth 클라이언트 ID는 Anthropic의 Claude Code CLI, OpenAI의 Codex CLI, Kimi Code CLI, 그리고 GitHub Copilot의 디바이스 코드 플로우에서 게시된 것입니다. 이들을 타사 도구에서 재사용하는 것은 해당 서비스 약관 위반일 수 있으며 언제든지 취소될 수 있습니다. 본인의 책임 하에 사용하십시오. API 키 흐름이 안전한 기본값입니다.
모델(Models)
--list-models
및 /model
은 모든 제공업체에 걸친 통합 카탈로그를 보여줍니다. 내장 항목에는 Claude, GPT/Codex, Gemini/Gemma, Kimi/Moonshot, DeepSeek, Groq 호스팅 Llama/Gemma/Compound, OpenRouter 라우팅 모델, Bedrock 모델 ID, Vertex 모델 ID, Azure OpenAI 배포판, Copilot 모델 및 기타 제공업체별 항목이 포함됩니다.
zot은 또한 저장된 API 키를 사용하여 GET /v1/models에서 발견된 실시간 ID를 병합하며, 이 캐시는 $ZOT_HOME/models-cache.json에 6시간 동안 보관됩니다. 추측적 카탈로그 항목도 포함되는데, 이는 상위 제공업체가 활성화하는 즉시 작동합니다.
사용자 정의 모델은 $ZOT_HOME/models.json을 통해 추가할 수 있습니다. 사용자 항목은 내장 및 실시간 발견된 모델 모두보다 우선하며, groq, openrouter, github-copilot, amazon-bedrock, google-vertex, azure-openai-responses, fireworks와 같은 제공업체 ID를 지원합니다.
, vercel-ai-gateway,
, mistral,
, and xai.
도구 (Tools)
네 가지 내장 도구. 번거로운 절차 없음. 실제로 코드를 배포하는 에이전트를 위한 최소한의 실행 가능한 도구 상자(Minimum Viable Toolbox)입니다.
read
- 텍스트 파일을 읽거나, 최신 터미널에서 PNG / JPG / GIF / WebP를 인라인으로 렌더링합니다.
write
- 파일을 생성하거나 덮어쓰며, 필요에 따라 상위 디렉토리를 생성합니다.
edit
- 기존 파일 내에서 하나 이상의 정확히 일치하는 문자열을 교체합니다.
bash
- 세션의 현재 작업 디렉토리(cwd)에서 쉘 명령어를 실행하며, stdout/stderr를 병합하고 타임아웃을 적용합니다.
/jail을 입력하면 모든 도구를 현재 디렉토리로 제한할 수 있습니다. Bash는 sudo, rm -rf / 및 기타 명백한 탈출 패턴을 거부합니다. 이는 사고를 방지하기 위한 가드레일(guardrail)이며, 엄격한 보안 경계(security boundary)는 아닙니다.
확장 기능 (Extensions)
zot은 서브프로세스(subprocess)와 JSON-RPC 프로토콜을 통해 어떤 언어로든 확장할 수 있습니다. 확장 기능은 슬래시 명령어(slash commands)를 등록하고, 모델에 새로운 도구를 노출하며, 권한 게이트(permission gates)를 위해 도구 호출을 가로채고, TUI 내부에 확장 기능 소유의 대화형 패널을 열 수 있습니다.
자동으로 설치되는 것은 아무것도 없습니다. zot ext install을 통해 기기별로 선택하여 설치하거나, 해킹 작업 중에는 zot --ext ./path를 통해 실행 시마다 선택할 수 있습니다. 각 확장 기능은 자체 디렉토리를 가지므로, 할 일(todo) 데이터, 설정 또는 캐시와 같은 영구적인 상태(persistent state)를 확장 기능 자체와 함께 보관할 수 있습니다.
zot ext install ./my-extension # $ZOT_HOME/extensions/로 복사됨
zot ext list # 로드된 목록 표시
zot ext logs my-extension -f # stderr 실시간 확인 (tail)
...
참조 구현체는 examples/extensions/ 아래에 Go, TypeScript, Node로 제공됩니다. 이제 프로토콜은 zot 내부에서 대화형 도구를 구축하기 위한 확장 기능 주도형 패널, 키 라우팅(key routing) 및 다시 그리기(redraws)까지 지원합니다. 프로토콜 사양을 읽어보세요.
기술 (Skills)
기술(Skills)은 YAML 프론트매터(frontmatter) 헤더가 포함된 폴더별 SKILL.md 파일입니다. zot은 시작 시 이를 발견하여 시스템 프롬프트에 이름을 표시하고, 모델이 필요할 때 본문을 로드할 수 있도록 내장된 skill 도구를 노출합니다. 에이전트는 필요한 지침만 정확히 가져오며, 그 이상은 가져오지 않습니다.
내장 및 사용자 설치 기술은 기본적으로 .zot/skills/에서 로드됩니다.
, $ZOT_HOME/skills/
, .claude/skills/
, 또는 .agents/skills/
입니다. 모든 기술 발견 (skill discovery) 기능을 비활성화하려면 --no-skill을 사용하세요. 기술 형식 (skill format)을 읽어보시기 바랍니다.
세션 (Sessions)
모든 턴 (turn)은 $ZOT_HOME 아래의 JSONL 트랜스크립트 (transcript)에 추가됩니다. -c를 사용하여 마지막 세션을 재개하거나, -r로 하나를 선택하거나, /sessions에서 모두 찾아볼 수 있습니다. /jump를 사용하면 히스토리를 편집하지 않고도 과거의 턴 사이를 이동할 수 있습니다. /compact를 사용하면 트랜스크립트를 단일 메시지로 요약하고 마지막 몇 번의 대화는 그대로 유지하여, 대화 흐름을 잃지 않으면서 컨텍스트 (context)를 확보할 수 있습니다. Zot은 모델의 컨텍스트 창 (context window)의 85%를 초과하면 자동으로 컴팩트 (auto-compact)를 수행합니다.
/session은 실행 중인 트랜스크립트에 대한 더 무거운 작업들을 다룹니다. export는 이를 휴대 가능한 .zotsession 파일(기본값 ~/Downloads)로 기록하여 다른 기기나 사용자에게 전달할 수 있게 하며, import는 이를 다시 일급 객체인 재개 가능한 세션으로 불러옵니다. fork는 과거의 어떤 사용자 메시지로부터도 새로운 세션으로 분기하여 (새로운 메타데이터에 부모 + 분기 지점이 기록됨), 원래의 스레드를 오염시키지 않고 다른 방향을 시도할 수 있게 합니다. tree는 이 디렉토리의 모든 분기를 부모/자식 들여쓰기로 보여주며 그중 어떤 것으로든 전환할 수 있게 합니다.
내보내기 (Export)는 메인 채팅 스레드(메시지, 도구 호출 (tool calls), 도구 결과 (tool results), 컴팩션 (compactions), 사용량)만 포함합니다. /swarm 하위 에이전트 (subagents)는 묶이지 않습니다. 에이전트별 상태는 Unix 소켓 인박스 (Unix-socket inbox)와 디스크 상의 세션 파일에 저장되며, 이 중 어느 것도 JSONL 파일을 통해 왕복하지 않습니다. 에이전트가 말한 내용을 공유하려면 트랜스크립트 뷰에서 수동으로 복사하십시오.
사이드 채팅 (Side chat)
/btw를 입력하면 전체 메인 세션이 고정된 컨텍스트 (frozen context)로 유지되는 사이드 채팅 오버레이 (side-chat overlay)를 엽니다. 메인 스레드를 비대하게 만들지 않고 빠르게 확인 질문을 던질 수 있습니다. 사이드 채팅에서 하는 말은 트랜스크립트에 추가되거나 세션 파일에 저장되지 않으므로, 실행 중인 컨텍스트 창을 가볍게 유지할 수 있습니다.
/btw # 오버레이 열기
/btw PUT이 리소스 전체를 대체하나요?
스웜 (Swarm)
메인 세션과 함께 실행되는 백그라운드 하위 에이전트 (subagents)입니다. /swarm을 입력하세요.
대시보드를 열려면 n을 누르세요.
에이전트를 생성하려면 n을 누르세요. 각 에이전트는 자체적인 모델 루프 (model loop), 자체적인 지속성 세션 파일 (persistent session file), 그리고 대시보드 내의 자체 채팅을 가진 별도의 zot 서브프로세스 (subprocess)입니다. 하지만 이들은 모두 호스트와 동일한 작업 디렉토리 (working directory)에서 실행되므로, 사용자와 동일한 파일을 보고 편집할 수 있습니다. 사용자는 메인 세션에서 계속 작업하고, 하위 에이전트 (subagents)들은 병렬로 작업합니다.
에이전트들은 사용자와 동일한 파일을 편집합니다. 이들은 호스트의 작업 디렉토리에 대해 메인 에이전트와 동일한 read / write / edit / bash 도구 (tools)를 사용합니다. 에이전트별 워크트리 (worktree)나 브랜치 (branch)는 존재하지 않습니다. 격리된 체크아웃 (checkout) 상태에서 병렬 편집이 필요한 경우, zot 외부에서 git worktree를 사용하여 직접 설정하십시오.
어떤 행에서든 enter를 누르면 해당 에이전트의 트랜스크립트 (transcript)가 열립니다. 이는 하단에 항상 활성화된 인라인 컴포저 (inline composer)가 있고, 자동 팔로우 (auto-follow) 스트리밍이 지원되며, 에이전트의 현재 활동(thinking, tool: edit_file 등)을 보여주는 비지 스피너 (busy spinner)가 포함된 채팅 오버레이입니다. 후속 질문을 입력하고 enter를 누르면 전송되며, esc를 누르면 대시보드로 돌아갑니다.
스크립트와 헤드리스 플로우 (headless flows)가 대시보드와 동일하게 작동할 수 있도록 커맨드 라인 (command line)에서 사용할 수 있는 일반적인 형태는 다음과 같습니다:
/swarm # 대시보드 열기
/swarm new <task> # 에이전트 생성
/swarm new --model gpt-5 <task> # 새 에이전트를 특정 모델로 고정
...
에이전트들은 자신을 생성한 세션에 범위가 지정되며(scoped), 해당 세션의 대시보드에만 나타납니다. 이들은 zot 재시작 후에도 $ZOT_HOME/swarm/agents/<id>/ 아래에 유지됩니다. 분리된(detached) 행에서 R을 누르면 동일한 세션과 인박스 소켓 (inbox socket)으로 에이전트를 다시 불러와 대화가 중단된 지점부터 계속할 수 있습니다.
에이전트별 모든 항목(세션 파일, 이벤트 로그, 인박스 소켓, 메타데이터)은 $ZOT_HOME/swarm/agents/<id>/ 아래에 저장됩니다. 에이전트의 실제 코드 편집은 사용자의 레포지토리 (repo)에 직접 반영됩니다. 일반적인 git status / git diff로 이를 추적하십시오.
/session export는 하위 에이전트들을 묶지 않습니다 — .zotsession
.zotsession은 단지 메인 채팅 기록(transcript)일 뿐이며, 스웜 에이전트(swarm agent)의 상태(세션 파일, unix-socket 인박스)는 머신 로컬(machine-local)에 존재하므로 이를 통해 왕복(round-trip)할 수 없습니다. 에이전트가 말한 내용을 공유하려면 트랜스크립트 뷰에서 수동으로 복사하십시오.
/settings를 사용하면
-> auto-swarm이 켜져 있을 때, 요청이 자연스럽게 독립적인 병렬 작업으로 분할되는 경우 메인 에이전트가 스스로 하위 에이전트(sub-agents)를 포크(fork)할 수 있습니다. 자세한 내용은 설정(Settings)을 참조하십시오.
설정 (Settings)
/settings를 입력하여
모든 영구 설정(persistent setting)이 포함된 대화 상자를 엽니다. up / down으로 이동하고, enter 또는 space로 선택된 행을 변경하며, esc로 닫습니다. 변경 사항은 $ZOT_HOME/config.json에 기록되며, 재시작 없이 다음 턴(turn)부터 적용됩니다.
지원되는 경우 이미지 렌더링 (render images when supported) — 터미널의 이미지 프로토콜(Ghostty, Kitty, iTerm2, WezTerm)을 사용하여 read가 반환하는 스크린샷과 이미지를 인라인(inline)으로 그리거나, 텍스트 플레이스홀더(placeholder)로 대체합니다. TERM_PROGRAM에서 자동 감지되며, 토글(toggle)로 감지 설정을 재정의할 수 있습니다. 이미지 프로토콜을 지원하지 않는 터미널에서는 해당 행이 회색으로 비활성화되며 강제로 꺼집니다.
자동 스웜 (auto-swarm) — 내장된 swarm_spawn 도구를 통해 메인 에이전트가 백그라운드 하위 에이전트들을 병렬로 생성하도록 합니다. 기본값은 꺼짐(Off) 상태입니다. 켜져 있을 때, 해당 도구는 실행 중인 에이전트에 등록되며 시스템 프롬프트(system prompt)에는 모델에게 독립적인 하위 작업(예: "A와 B를 구현하십시오", "세 개의 파일을 조사하십시오")을 선제적으로 위임하도록 지시하는 짧은 부가 설명이 추가됩니다. 각 생성(spawn) 직후 메인 턴은 즉시 계속 실행됩니다. 수동으로 생성된 에이전트와 마찬가지로 /swarm에서 하위 에이전트들을 모니터링, 메시지 전송 또는 종료(kill)할 수 있습니다.
배치(batch) 내의 마지막 하위 에이전트가 초기 작업을 완료하는 즉시, zot은 각 에이전트의 상태, 작업 및 트랜스크립트 끝부분(transcript tail)을 요약하는 단일 [auto-swarm update] 메시지를 메인 채팅에 다시 주입합니다. 그러면 메인 에이전트는 에이전트들을 ID로 참조하여 짧은 후속 요약을 작성하므로, 작업이 확산되는 동안에도 하나의 대화 흐름을 유지할 수 있습니다. 세션 중간에 토글을 끄면 swarm_spawn이 제거됩니다.
라이브 에이전트(live agent)로부터 제거하며, 다음 턴에서 부가 정보(addendum)를 제거합니다 — 모델이 위임(delegate)을 시도하는 것을 중단합니다.
thinking level — 지원되는 모델에 대해 추론 깊이(reasoning depth)를 선택합니다. 기본값은 off입니다. 사용 가능한 레벨은 off (추론 없음), minimum (~1k thinking tokens), low (~2k), medium (~8k), high (~16k), 그리고 maximum (~32k)입니다. zot은 이러한 레벨을 Claude와 Gemini의 토큰 예산(token budgets), Gemini의 thinking-level enum, 또는 OpenAI 스타일의 reasoning effort와 같이 각 제공업체(provider)가 지원하는 가장 유사한 와이어 포맷(wire format)으로 매핑합니다. 현재 상태 표시줄에는 thinking: <level>로 표시됩니다.
또한, --reasoning 옵션을 사용하여 실행마다 설정을 변경할 수 있습니다.
color theme — auto/dark/light를 선택하거나 $ZOT_HOME/themes 또는 로드된 확장 프로그램(extension)에서 임의의 JSON 테마를 선택합니다. 테마는 UI 색상, 구문 색상(syntax colors), 스피너 프레임(spinner frames), 스피너 메시지 또는 이들의 조합 등 테마가 지정한 항목만 재정의할 수 있습니다. 전환 시 즉시 적용되며, 선택한 테마가 사라지면 zot은 auto로 재설정됩니다.
Themes
AI 자동 생성 콘텐츠
본 콘텐츠는 HN AI Posts의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기