5dive-ai/5dive는 "AI 에이전트들이 모인 회사를, 내가 소유한 서버 한 대에서 돌리는" 도구입니다. 이름 붙인 에이전트(claude, codex, grok…)를 각각 다른 모델·역할로 띄우고, 조직도(누가 누구에게 보고하는지)에 올린 뒤, 공유 할 일 목록(backlog)을 주면 서로 일을 주고받으며 자율적으로 일합니다. 그러다 사람만이 결정할 수 있는 순간이 오면 텔레그램으로 당신 휴대폰에 "탭 한 번으로 답하는" 버튼을 보냅니다. 놀라운 점은 거대한 서버 프레임워크가 아니라 셸 스크립트 한 덩어리(5dive CLI)가 전부라는 것 — 메시지 브로커도, 프로토콜도, 별도 오케스트레이터 서버도 없이 "공유 파일시스템 + 하나의 CLI"가 곧 버스(통신로) 역할을 합니다. 아직 별 14개의 초기 프로젝트지만, "멀티 에이전트 회사"라는 개념을 어떻게 최소한의 부품으로 실제 동작하게 만드는지 보여 주는 보기 드문 교본입니다. (저장소: 5dive-ai/5dive · Shell/TypeScript · ★14 · MIT)
"직원을 한 명씩 채용하듯 AI 에이전트를 띄우고, 조직도와 할 일 목록만 쥐여 주면 알아서 굴러가는 '1인 사장의 회사 운영체제'."
각 에이전트는 리눅스 사용자 한 명 + 그가 24시간 켜 둔 AI CLI 세션(claude/codex/grok…) 하나입니다. 사람이 직원에게 사내 메신저로 일을 시키듯, 에이전트는 5dive 명령 하나로 서로에게 일을 넘깁니다. 그래서 별도의 중앙 서버나 통신 규약이 필요 없습니다 — 같은 서버의 파일시스템과 같은 CLI가 곧 '사내 인프라'입니다.
핵심 특징 셋: ① 조직도 + 공유 할 일 목록(누가 누구 밑에서 일하고, 어떤 일이 큐에 쌓여 있는지), ② 심장박동(heartbeat)(할 일이 있을 때만 에이전트를 깨워 토큰·비용을 아낌), ③ 사람에게 에스컬레이션(결정이 필요할 때만 텔레그램으로 탭 버튼을 보냄).
claude, OpenAI의 codex, xAI의 grok)입니다. 5dive는 이런 CLI를 직접 만들지 않고, 이미 있는 공식 CLI들을 '직원처럼' 여러 명 띄워 묶어 주는 관리자 역할만 합니다.구체적으로 5dive의 실체는 약 88만 바이트짜리 단일 셸 스크립트 5dive입니다. 이건 사람이 직접 쓴 게 아니라, 읽기 좋게 쪼개 둔 src/*.sh 조각들을 build.sh가 하나로 이어 붙여 만든 '번들'입니다(설치 시 서버에 파일 하나만 떨어뜨리기 위함). 그 위에 텔레그램 봇을 다루는 TypeScript 코드(cos-lib.ts 등)와, 에이전트의 동작을 가로채 텔레그램과 연결하는 훅(hook) 스크립트들이 얹혀 있습니다.
이 문서가 파고드는 건 "어떻게 설치하나"가 아니라 그 안의 설계입니다 — "브로커도 없이 에이전트들이 어떻게 서로 일을 넘기나", "할 일이 없을 때 토큰을 한 톨도 안 쓰게 만드는 heartbeat의 트릭은 무엇인가", "AI가 멋대로 일을 끝내지 못하게 막는 '사람 결재' 게이트는 어떻게 강제되나". 멀티 에이전트 시스템을 최소한의 부품으로 짓는 법을 배우려는 사람에게 작지만 밀도 높은 교본입니다.
"무거운 멀티 에이전트 프레임워크"가 넘쳐나는 시대에, 정반대로 '브로커 없는 최소 설계'를 택한 점.
요즘 "AI 에이전트 여러 개를 협업시키는" 도구는 넘쳐납니다. 그런데 5dive가 라이브 멘션을 타고 화제가 된 이유는 대부분이 복잡하게 푸는 문제를 의도적으로 단순하게 풀었기 때문입니다. 다섯 가지로 정리하면:
보통 멀티 에이전트 시스템은 메시지 큐(브로커), 통신 규약(프로토콜), 중앙 조율 서버(오케스트레이터)를 깝니다. 5dive의 README는 정반대로 못 박습니다 — "브로커도, 프로토콜도, 오케스트레이터도 없다. 공유 파일시스템과 공유 CLI뿐." 에이전트가 다른 에이전트에게 일을 시킬 때 그냥 5dive agent send <상대> "..."를 호출하면 됩니다. CLI 그 자체가 통신로(버스)인 셈입니다.
가장 영리한 비용 설계입니다. 에이전트를 늘 돌리면 토큰(돈)이 줄줄 새지만, 5dive는 할 일 큐에 그 에이전트 몫의 '할 일'이 있을 때만 깨웁니다(§4 참고). 할 일이 없으면 토큰을 한 톨도 안 쓰고, 모델의 사용량 시계조차 시작되지 않습니다.
에이전트가 "사람만이 결정할 수 있는 일"(예: "가격 정책을 출시할까요?")에 막히면, 그 작업을 당신에게 '주차(park)'해 둡니다. 그 질문은 텔레그램에 탭하면 답이 되는 버튼으로 도착하고, 당신이 하나를 누르면 막혀 있던 에이전트가 풀려 다시 일합니다.
에이전트의 인증 토큰은 모델 제공사(Anthropic·OpenAI 등)로 직접 갑니다 — 5dive 회사를 거치지 않습니다. 텔레메트리(사용 추적)도, 오류 보고도 없어 어떤 데이터도 서버 밖으로 나가지 않습니다. 공식 claude CLI를 내 Pro/Max 구독으로 그대로 쓰므로 Anthropic 정책상으로도 안전합니다.
각 에이전트는 독립된 리눅스 사용자이고, 3단계 격리(admin/standard/sandboxed) 중 하나가 적용됩니다. 샌드박스로 묶으면 그 에이전트는 당신의 홈 디렉토리를 못 읽고 sudo도 못 씁니다. "AI에게 셸을 쥐여 주는" 위험을 OS 차원의 권한 분리로 막은 점이 돋보입니다.
| 비교 대상 | 성격 | 5dive와의 차이 |
|---|---|---|
| CrewAI / AutoGen | 파이썬 멀티 에이전트 프레임워크 | 그쪽은 한 프로세스 안에서 에이전트를 코드로 엮는다. 5dive는 OS 수준(리눅스 사용자 + systemd + 공식 CLI)에서 엮어, 진짜 별개 프로세스·진짜 권한 격리가 된다. |
| LangGraph | 에이전트 그래프 실행 엔진 | 중앙 그래프/상태 머신이 흐름을 통제. 5dive는 중앙 엔진이 없고 공유 sqlite 큐 + CLI 호출로 느슨하게 협업. |
| Claude Code 단독 | 1인용 코딩 에이전트 CLI | 5dive는 그 claude를 여러 명 띄워 조직하고, 텔레그램·heartbeat·조직도·작업 큐를 얹는 '바깥 껍데기'다. |
별 14개, 버전 0.1.x 단계입니다. "프로덕션에서 검증된 도구"라기보다 "제작사가 자기 회사를 실제로 이걸로 굴리며 다듬는 중인 초기 오픈소스"로 봐야 정확합니다(README도 "우리 회사를 이걸로 돌린다"고 명시). 일부 기능(예: loop 오케스트레이션의 여러 동사)은 코드에 "아직 미구현(WIP)"이라고 정직하게 적혀 있습니다.
토픽에 zero-human-company가 있지만, 실제 설계의 핵심은 오히려 "사람이 꼭 필요할 때만 개입한다"는 사람-결재 게이트입니다. 완전 무인이 아니라 "평소엔 자율, 결정은 사람"이 정확한 그림입니다.
에이전트는 셸을 쓸 수 있는 리눅스 사용자입니다. README가 OS 패치·SSH 키 전용·방화벽 기본 차단·격리 티어·텔레그램 허용목록 같은 보안 위생을 권고하는 이유입니다. 격리를 제대로 안 걸면 위험할 수 있으니, 공부용은 반드시 도커나 일회용 VM에서 시작하세요.
놀랍도록 단순하다 — 거대한 런타임 대신 셸 + 리눅스 기본기 + 약간의 TypeScript.
5dive는 웹 서비스가 아니라 '서버 위에서 도는 에이전트 관리자'라, 보통의 백엔드/프론트엔드 구분 대신 ① CLI 코어(셸) ② 런타임·인프라(리눅스/systemd) ③ 채널·연동(TypeScript/훅)으로 나눠 보는 게 자연스럽습니다.
5dive의 거의 모든 로직은 Bash 셸 스크립트입니다. src/header.sh(전역 설정·set -euo pipefail) → src/lib/*.sh(공통 헬퍼: 출력·검증·상태·감사로그·작업 DB) → src/cmd_*.sh(각 명령: agent·task·org·heartbeat…) → src/main.sh(명령 분배 + 종료 트랩). 파이썬이나 Go 런타임을 깔 필요가 없어 리눅스라면 어디서든 그냥 돕니다.
| 구성요소 | 역할 |
|---|---|
| systemd | 각 에이전트를 5dive-agent@<이름>.service로 항상 켜 두고 죽으면 자동 재시작. 격리·종료 처리·환경변수 주입을 담당. |
| 리눅스 사용자/그룹 | 에이전트 1명 = 사용자 agent-<이름> 1명. 권한 분리(격리 티어)의 토대. |
| tmux | 에이전트의 AI CLI 세션을 '꺼지지 않는 터미널'에 담아 둠. 메시지 주입은 tmux send-keys로. |
| SQLite | 공유 작업 큐·조직도·loop 기록 저장. 서버 없이 파일 하나로 동작, 자체 락으로 동시 쓰기 정리. |
| cron | 5dive heartbeat tick(주기적 깨우기)·standup 다이제스트·자동 업데이트의 구동기. |
| jq | JSON 파싱/조립. 모든 명령이 --json 출력을 지원하는 비결. |
| 구성요소 | 역할 |
|---|---|
cos-lib.ts / cos-runner.ts | '비서실장(Chief of Staff)' 봇 — 텔레그램 Bot API 9.6의 "관리형 봇"으로 에이전트마다 자식 봇을 자동 생성/설정. bun(빠른 JS 런타임)으로 실행. |
hooks/*.sh | 에이전트의 행동을 가로채는 라이프사이클 훅 — 질문을 텔레그램으로 돌리기, 실패 알림, 에이전트끼리의 대화 미러링, 재시작 후 복구 등. |
| 채널 플러그인 | claude는 마켓플레이스 텔레그램 플러그인, codex는 MCP 서버, opencode는 독립 릴레이 — 타입마다 텔레그램 붙이는 방식이 다름. |
| 지원 에이전트 타입 | claude · codex · antigravity · grok · hermes · openclaw · opencode (7종). 각각 모델군·인증·채널이 표로 정리됨. |
핵심 트릭은 "읽을 땐 쪼개고, 배포할 땐 합친다"입니다. build.sh가 src/*.sh를 정해진 순서로 cat(이어붙이기)해 단일 5dive 바이너리를 만들고, CI가 매 푸시마다 ./build.sh && git diff로 "번들과 소스가 어긋나지 않았는지(drift)"를 검사합니다. 설치는 curl -fsSL https://install.5dive.com | sudo bash 한 줄 — install.sh가 의존성(jq·tmux 등)을 깔고, 바이너리·systemd 유닛·훅·스킬을 내려받습니다.
"AI 회사 운영체제"라면 화려한 프레임워크를 떠올리기 쉽지만, 5dive는 리눅스 서버라면 추가 설치 없이 어디서든 도는 것을 최우선으로 삼았습니다. systemd·tmux·sqlite·cron은 이미 모든 리눅스에 있는 '국민 부품'이라, 의존성을 최소화하면 설치가 단순해지고 보안 표면도 줄어듭니다. "최소한의 새 부품으로 푼다"는 철학이 스택 선택에 그대로 드러납니다.
"공유 파일시스템 + 하나의 CLI = 버스." 중앙 서버가 없다는 게 곧 아키텍처다.
전체 구조의 핵심은 "각 에이전트는 독립된 리눅스 사용자 + 항상 켜진 AI CLI이고, 그들을 잇는 끈은 ① 같은 서버의 공유 파일(특히 sqlite 작업 큐)과 ② 같은 5dive CLI 호출뿐"입니다. 그림으로 보면:
"새 작업이 큐에 들어옴 → 에이전트에 배정 → 작업 → 막히면 사람 호출 → 사람이 답 → 재개"를 파일·컴포넌트 단위로 추적해 봅시다.
사장(또는 상사 에이전트)이 할 일을 등록합니다. src/cmd_task.sh가 공유 SQLite 작업 테이블(src/lib/tasks_db.sh)에 한 줄을 넣고 DIVE-42 같은 식별자를 발급합니다. 반복 작업이면 cron 일정(--recurring)으로 매번 자동 생성됩니다.
5dive task add "어젯밤 CI 실패 분류" --assignee=ops --recurring="0 7 * * *"
서버의 cron이 몇 분마다 5dive heartbeat tick(src/cmd_heartbeat.sh)을 호출합니다. tick은 등록된 에이전트마다 딱 한 가지를 묻습니다 — "이 에이전트 앞으로 'todo' 상태인 작업이 큐에 있나?"
/clear로 대화를 깨끗이 한 뒤(fresh 모드) "작업 하나만 하고 다시 쉬어라"는 넛지를 tmux로 주입."틱 한 번 = 작업 하나"가 핵심 규율입니다. 다음 작업은 다음 틱이 가져갑니다. 게다가 폭주 방지 장치까지 있습니다 — 너무 오래 in_progress인 작업은 리퍼(reaper)가 강제로 큐에 되돌리고, 여러 번 넛지해도 시작조차 안 되는 작업은 '굶주림(starvation)'으로 감지해 사람에게 surface합니다.
넛지를 받은 에이전트(예: agent-pm)는 5dive task start DIVE-42로 작업을 집고 일을 시작합니다. 혼자 못 하면 부하 직원에게 넘깁니다 — 이때 호출이 버스입니다.
5dive agent send coder "DIVE-42의 로그 파서 수정해줘" # 비동기: 던지고 끝
5dive agent ask coder "수정 다 됐어?" --timeout=120 # 동기: 답이 올 때까지 대기
받는 쪽 화면엔 [5dive-msg from=pm id=...]처럼 "누가 찌르는지"가 자동으로 붙습니다. 별도 메시지 서버 없이, 상대 에이전트의 tmux 세션에 키를 직접 입력하는 방식입니다.
에이전트가 "출시할까 말까" 같은 결정에 부딪히면, 작업을 사람에게 park하고 자기는 멈춥니다(cmd_task_need).
5dive task need DIVE-42 --type=approval \
--ask="가격 정책 v2를 출시할까요?" --options="ship|hold" --recommend=ship
이 호출이 훅(hooks/*.sh)을 통해 텔레그램으로 나가, 당신 휴대폰에 "✅ 추천: ship" 헤더 + 탭 가능한 버튼으로 도착합니다. 작업 상태는 blocked가 됩니다. (텔레그램에선 보이지 않는 tmux 전용 질문 UI인 AskUserQuestion·ExitPlanMode는 hooks/pretool-telegram-question.sh가 막고, 대신 "번호로 된 보기를 일반 메시지로 보내라"고 지시합니다.)
당신이 버튼을 탭하면 5dive task answer DIVE-42가 실행돼 답이 큐에 기록되고, 작업이 blocked에서 풀립니다. 다음 heartbeat 틱에서 주인 에이전트가 다시 깨어나 이어서 일하고 5dive task done으로 마무리합니다. 5dive task inbox는 "사람을 기다리는 모든 작업"을, 5dive org tree는 조직도를 보여 줍니다.
에이전트 간 통신을 위해 메시지 큐를 깔지 않습니다. 대신 같은 5dive CLI를 호출하면, 그 명령이 상대 에이전트의 tmux 세션에 send-keys로 글자를 넣어 줍니다. "통신로를 새로 만들지 말고, 이미 있는 것(공유 파일 + 공유 실행파일)을 통신로로 쓰자"는 발상입니다.
늘 켜 두면 비싸고, 완전히 꺼 두면 일을 못 합니다. 5dive는 그 사이를 "큐에 내 작업이 있을 때만 깨어난다"로 해결합니다. 깨우는 주기(everyMin)는 '실제로 깨어난 사이의 최소 간격'이라, cron이 더 자주 돌아도 일 없는 에이전트는 값싼 sqlite 카운트만 한 번 더 할 뿐 비용이 안 듭니다.
읽기 좋은 src/*.sh와 배포용 단일 5dive가 어긋나면 사고가 납니다. 그래서 build.sh로 항상 다시 빌드하고, CI가 git diff로 "소스만 고치고 번들을 안 고쳤거나 그 반대"인 경우를 잡아냅니다. 순서도 엄격합니다 — header.sh(전역 변수)는 맨 앞, main.sh(종료 트랩 + main "$@")는 맨 뒤.
에이전트마다 다른 리눅스 사용자를 만들고 systemd 유닛에 권한·자원 제한을 건 뒤, admin/standard/sandboxed 중 한 티어를 적용합니다. "샌드박스 에이전트는 홈 못 읽고 sudo 못 함" 같은 보장이 애플리케이션 코드가 아니라 OS에서 강제됩니다 — 훨씬 깨기 어려운 방어선입니다.
AI가 자기 결재를 스스로 통과시키면 의미가 없습니다. 그래서 approval·secret 게이트는 에이전트 계정(agent-*)으로는 막혀 있고(DIVE-519), 켜 두면 루트만 발급할 수 있는 '사람 출처 증명 토큰'(5dive gate-proof)이 있어야 통과됩니다. "결정의 최종 권한은 사람"을 코드로 못 박은 영리한 설계입니다.
5dive의 거의 모든 영리함은 "이미 검증된 OS 기본기(리눅스 사용자·systemd·tmux·sqlite·cron)를 조합해 멀티 에이전트 문제를 푼다"로 요약됩니다. 메시지 버스가 필요하면 CLI 호출 + tmux로, 항상 켜기가 필요하면 systemd로, 비용 절약이 필요하면 cron + 큐 카운트로, 격리가 필요하면 리눅스 사용자 권한으로. "바퀴를 다시 발명하지 않는다"는 엔지니어링 절제의 좋은 본보기입니다.
진짜 로직은 전부 src/ 아래 셸 조각들. 루트의 5dive는 그것들을 이어붙인 '완성품'일 뿐.
읽는 순서를 추천하자면: ① README.md(전체 개념) → ② src/main.sh(어떤 명령들이 있고 어떻게 분배되는지 한눈에) → ③ src/cmd_heartbeat.sh 상단 주석(비용 설계의 핵심) → ④ systemd/5dive-agent@.service + 5dive-agent-start(에이전트가 실제로 어떻게 뜨는지) → ⑤ src/cmd_task.sh(작업·사람결재 흐름) 순입니다. 루트의 거대한 5dive 파일은 자동 생성물이니 직접 읽지 말고 src/를 보세요.
이 저장소의 진짜 가치는 "멀티 에이전트 + 견고한 셸 시스템 프로그래밍"을 한곳에서 코드로 볼 수 있다는 것.
src/main.sh · lib/"셸 스크립트는 대충 짜는 것"이라는 편견을 깨는 코드입니다. set -euo pipefail(오류·미정의 변수·파이프 실패에 즉시 중단), 종료 트랩으로 모든 경로가 감사 로그를 남기게 하기, 레지스터 락(with_registry_lock)으로 대시보드 동시 클릭의 경쟁 상태(race) 막기, 종료코드 표(0=ok, 4=not_found, 6=auth_required…)를 --json 에러와 일치시키기 — "셸로도 신뢰성 있는 도구를 만들 수 있다"는 모범을 보여 줍니다.
cmd_agent.sh의 send/ask가 백미입니다. 상대 에이전트의 tmux 세션에 send-keys로 글자를 주입하고, ask는 그 뒤 화면 스크롤백이 더 이상 안 자랄 때까지 폴링해 답을 긁어옵니다. "메시지 큐 없이 동기 RPC 흉내 내기"의 실전 예시입니다. 받는 쪽엔 [5dive-msg from=<보낸이>] 꼬리표가 자동으로 붙습니다.
cmd_heartbeat.sh이 파일의 상단 주석만 읽어도 큰 공부가 됩니다. "틱은 자주, 깨움은 드물게"(체크는 매 틱, 비용은 실제 깨울 때만), 리퍼(폭주하는 작업 강제 회수), 굶주림 감지(넛지해도 안 시작되는 작업 surface), 고아 회수(claude 프로세스가 죽어 주인 없는 작업 되돌리기) 등 "자율 에이전트가 멈추거나 폭주할 때"를 다루는 방어 코드가 촘촘합니다.
# heartbeat tick의 핵심 분기(요지)
no todo -> do nothing # 안 깨움 = 토큰 0
already in_progress -> skip # 두 번 찌르면 일이 엉킴
has todo + due -> /clear + 넛지 1개 # "한 작업만 하고 쉬어라"
5dive-agent@.service템플릿 유닛(@로 인스턴스화 → User=agent-%i), 여러 EnvironmentFile로 인증·채널 환경을 겹쳐 주입, Restart=on-failure로 자동 부활. 특히 ExecStop 주석은 보석입니다 — "antigravity의 agy 바이너리는 SIGTERM을 무시하고 SIGHUP에만 죽는다"는 실전 디버깅이 그대로 코드에 남아, 종료 시간을 60초에서 0.05초로 줄인 사연이 적혀 있습니다.
hooks/에이전트의 동작 지점(도구 사용 전/후, 정지 시)에 끼어드는 훅 패턴을 통째로 볼 수 있습니다. 백미는 pretool-telegram-question.sh — tmux에서만 보이는 질문 UI(AskUserQuestion)를 막고, "그 UI는 텔레그램 사용자가 못 보니, 질문을 번호 매긴 일반 메시지로 보내라"고 에이전트에게 되돌려 줍니다. "AI의 출력 형식을 채널에 맞게 교정하는" 영리한 중간 계층입니다.
team-templates/*.yaml5dive.yaml 하나로 여러 에이전트 + 역할 + 조직도 + 시작 백로그를 선언하고 5dive up으로 한 번에 띄웁니다(도커 컴포즈와 닮음). reports_to가 조직 진실의 단일 출처라, 거기서 조직도 엣지와 각 에이전트의 CLAUDE.md에 붙는 "## 보고 라인" 섹션("당신의 상사는 누구, 부하는 누구, 이렇게 연락하라")을 자동 생성합니다 — 위임이 장식이 아니라 실제로 동작하게 만드는 부분입니다.
cos-lib.ts유일한 큰 TypeScript 조각입니다. 텔레그램 Bot API 9.6의 "관리형 봇"으로, 고객 소유의 '비서실장 봇'이 에이전트마다 자식 봇을 자동 생성·설정(이름·설명·아바타)·토큰 회전하게 합니다. 부수효과를 최소화한 순수 함수로 짜 단위 테스트가 가능하게 한 점, "avatar 업로드는 multipart attach:// 래퍼가 필요하다" 같은 API 함정 주석이 학습 포인트입니다.
build.sh"소스는 쪼개 읽고, 배포는 한 파일로"를 어떻게 안전하게 유지하는지 보여 줍니다. cat 순서를 엄격히 지키고(전역 먼저, main 마지막), CI가 ./build.sh && git diff --exit-code 5dive로 양방향 드리프트를 잡습니다. 생성물과 소스의 동기화를 사람 기억이 아니라 자동화로 보장하는 좋은 패턴입니다.
gate-proof · 격리 티어"AI가 자기 승인을 스스로 통과시키지 못하게" 만드는 법을 보여 줍니다. approval/secret 게이트는 에이전트 UID로는 막혀 있고, 루트만 발급하는 사람-출처 증명 토큰이 있어야 통과됩니다. 격리 티어(admin/standard/sandboxed)와 함께, "신뢰 경계를 OS 권한으로 그린다"는 보안 사고법을 배울 수 있습니다.
서버급 하드웨어가 필요한 게 아니다 — 핵심은 "리눅스 + systemd + 루트 권한".
| 항목 | 요구사항 / 메모 |
|---|---|
| 운영체제 | systemd가 있는 리눅스(Ubuntu 22.04+ 권장). macOS·윈도우는 직접 지원 안 함 → 도커 이미지 사용. |
| 권한 | 설치에 루트(sudo) 필요 — jq·tmux 등 의존성을 apt로 깔고, 리눅스 사용자/systemd 유닛을 만들기 때문. |
| 핵심 의존성 | systemd · tmux · jq · sqlite · cron · bun/node(텔레그램 브리지용). 설치기가 자동 설치. |
| AI CLI | 에이전트의 '두뇌'인 claude/codex/grok/antigravity 등은 각자 설치 + 인증(자기 구독/API 키). 5dive가 설치를 도와주기도 함. |
| 네트워크 | 모델 제공사 API(Anthropic·OpenAI 등) + 텔레그램 봇 API로 나가는 연결. 인증 토큰은 제공사로 직접. |
| 메모리/CPU | 5dive 자체는 가벼움(셸+sqlite). 실제 부하는 동시에 띄운 AI CLI 세션 수에 비례 — 에이전트 1~몇 명이면 소형 VPS로도 충분. |
| 도커 경로 | systemd/루트/리눅스가 없으면 docker build -f docker/Dockerfile → --privileged로 실행(컨테이너 안에서 systemd를 쓰기 위함). |
공부가 목적이라면 내 메인 서버에 바로 깔지 말고, 일회용 VM이나 도커 컨테이너에서 시작하세요. 에이전트는 셸을 쓸 수 있으니, 잘못 설정하면 위험합니다. 무료/저가 Ubuntu VPS 하나에 에이전트 1명만 띄워 "작업 큐에 일을 넣으면 heartbeat가 깨우고, 막히면 텔레그램으로 묻는" 한 사이클만 돌려 봐도 이 시스템의 핵심을 체감할 수 있습니다.
읽기만 하면 금방 잊는다. 난이도별로 손을 움직여 보자. (모두 일회용 VM/도커에서!)
docker build -f docker/Dockerfile -t 5dive . 후 --privileged로 실행해 들어간 뒤, 5dive init 마법사로 에이전트 하나를 만들고 텔레그램으로 첫 메시지를 받아 보세요. 목표는 결과물이 아니라 "설치→인증→생성→hello가 도는 걸 내 눈으로 보는 것"입니다.
5dive agent list로 상태(active)를 확인하고, 5dive watch로 실시간 보드를 띄워 보기.src/main.sh 정독코드를 한 줄도 안 돌려도 됩니다. src/main.sh의 case "$top" in ... 분배 표를 읽으며 어떤 명령이 있고, 어떤 게 루트가 필요하며(require_root), 어떤 게 레지스터 락(with_registry_lock)을 잡는지 표로 정리해 보세요. "잘 짠 CLI의 골격"이 한눈에 들어옵니다.
task·org는 락 없이 돌고(힌트: sqlite 자체 락), agent create는 락을 잡을까?에이전트 하나에 5dive task add "..." --assignee=<이름>로 일을 넣고, 5dive heartbeat on <이름> --every=5m 후 5dive heartbeat tick을 직접 호출해 "할 일이 있을 때만 깨어나는지"를 확인하세요. 할 일이 없을 때는 tick이 아무 일도 안 하는 것도 관찰합니다.
in_progress로 두고 오래 방치하면, 리퍼가 언제 그것을 큐로 되돌리는가? (_HB_STALE_* 상수 참고)에이전트 둘(예: pm, coder)을 만들고 5dive org set coder --manager=pm으로 조직도를 세운 뒤, pm에게 5dive agent send coder "..."를 시켜 보세요. 받는 쪽 화면에 [5dive-msg from=pm] 꼬리표가 붙는지, 5dive org tree가 조직도를 그리는지 확인합니다.
5dive agent ask(동기)와 send(비동기)의 차이를 체감 — ask는 답이 올 때까지 어떻게 기다리나?5dive task need DIVE-N --type=approval --ask="..." --options="A|B" --recommend=A로 작업을 사람에게 park하고, 텔레그램에 탭 버튼이 도착하는지 확인하세요. 버튼을 눌러(또는 5dive task answer로) 막힌 에이전트가 풀려 재개되는 전 과정을 추적합니다.
5dive gate-proof enforce on 후, 에이전트 계정으로 직접 task answer를 시도하면 왜 거부되는가? (사람-출처 증명의 의미)5dive team import startup(또는 직접 쓴 5dive.yaml + 5dive up)으로 5인 팀을 한 번에 올리고, 각 에이전트의 ~/.claude/CLAUDE.md에 자동 생성된 "## 보고 라인"이 들어갔는지 확인하세요. 그다음 5dive export로 살아 있는 조직을 다시 5dive.yaml로 덤프해 봅니다(round-trip).
reports_to 하나가 어떻게 ① 조직도 엣지 ② CLAUDE.md 보고 섹션 ③ 시작 백로그(goals)로 동시에 펼쳐지는가?이 저장소를 '교과서'로 삼아 6주간 "멀티 에이전트 + 셸 시스템 설계"를 정복하는 코스.
| 주차 | 주제 | 이 저장소에서 볼 곳 + 곁들일 자료 |
|---|---|---|
| 1주 | 견고한 Bash 시스템 프로그래밍 | src/main.sh·lib/*.sh의 set -euo pipefail·종료 트랩·락·종료코드. 곁들임: Google Shell Style Guide, shellcheck. |
| 2주 | systemd 서비스 운영 | systemd/5dive-agent@.service 정독. 개념: 템플릿 유닛(@), EnvironmentFile 겹치기, Restart, KillMode/ExecStop, 자원 제한. |
| 3주 | 멀티 에이전트 협업 패턴 | cmd_agent.sh(send/ask) + cmd_org.sh. 비교: CrewAI·AutoGen·LangGraph의 '중앙 엔진' 방식과 5dive의 '브로커 없는' 방식. |
| 4주 | 작업 큐 · 스케줄링 · 자율 루프 안전장치 | cmd_heartbeat.sh·lib/tasks_db.sh. 개념: 멱등성, 리퍼/굶주림/고아 회수, cron 구동기, sqlite 동시성. |
| 5주 | 채널 연동 · 라이프사이클 훅 | hooks/*.sh + cos-lib.ts. 개념: PreToolUse/Stop 훅, 텔레그램 Bot API(관리형 봇), tap-to-answer UX. |
| 6주 | 보안 경계 · 격리 · 배포 | 격리 티어 + gate-proof + install.sh/build.sh. 개념: 리눅스 사용자 권한 분리, 서버 하드닝, 단일 번들 + 드리프트 CI. |
한 번에 다 보려 하지 마세요. 1~2주(Bash 규율 + systemd)만 제대로 소화해도 "신뢰성 있는 리눅스 도구를 짜는 사람"이 됩니다. 멀티 에이전트가 목적이라면 3~4주(send/ask + heartbeat)가 핵심 — §4의 'end-to-end 흐름' 6단계를 코드로 따라가며 직접 한 사이클 돌려 보는 게 가장 빠른 길입니다.
이 문서·저장소에 나온 용어를 한 줄씩 정리. 모르면 여기로 돌아오기.
| 용어 | 한 줄 뜻 |
|---|---|
| 에이전트(agent) | 스스로 도구를 쓰고 일을 해내는 AI 비서. 5dive에선 리눅스 사용자 1명 + AI CLI 세션 1개. |
| 에이전틱 CLI | 터미널에서 도는 AI 프로그램(claude·codex·grok…). 에이전트의 '두뇌'. |
| 버스(bus) | 부품들이 데이터를 주고받는 공용 통신로. 5dive에선 "공유 CLI 호출 + tmux 주입"이 곧 버스. |
| 백로그(backlog) | 아직 처리 못 한 할 일 목록. 5dive는 공유 sqlite 작업 큐로 구현. |
| 오케스트레이션 | 여러 일꾼의 순서·역할을 조율하는 것. 5dive는 중앙 지휘자 없이 큐+CLI로 느슨하게 조율. |
| 조직도(org chart) | 누가 누구에게 보고하는지(reports_to). 위임과 에스컬레이션의 뼈대. |
| heartbeat(심장박동) | cron이 주기적으로 "할 일 있는 에이전트만" 깨우는 스케줄러. 비용 0의 핵심. |
| 틱(tick) | heartbeat가 한 번 도는 것. "틱 1회 = 작업 1개"가 규율. |
| 리퍼(reaper) | 너무 오래 진행 중인 작업을 강제로 큐에 되돌리는 회수 장치(폭주 방지). |
| 에스컬레이션 | 에이전트가 못 정하는 일을 사람에게 올려 결정을 구하는 것. |
| park / need | 작업을 사람에게 맡겨 두고(blocked) 답을 기다리는 동작. inbox에 쌓임. |
| tap-to-answer | 텔레그램에 도착하는 "탭 한 번이 곧 답"인 버튼 UI. |
| 격리 티어 | 에이전트 권한 등급 — admin(전체)·standard(제한)·sandboxed(자기 홈만, sudo 불가). |
| gate-proof | 승인/비밀 게이트를 통과시킬 때 요구되는 '사람 출처 증명 토큰'(루트만 발급). |
| systemd | 리눅스에서 프로그램을 백그라운드 서비스로 항상 켜 두고 죽으면 재시작하는 표준 관리자. |
| 템플릿 유닛(@) | 하나의 systemd 정의를 인스턴스별로 찍어내는 것(5dive-agent@coder.service). |
| tmux | '꺼지지 않는 터미널' 세션 관리자. 에이전트의 CLI를 담고, 메시지를 send-keys로 주입. |
| SQLite | 서버 없이 파일 하나로 도는 데이터베이스. 작업 큐·조직도 저장. |
| cron | 리눅스의 시간 기반 작업 스케줄러. heartbeat·다이제스트·자동 업데이트의 구동기. |
| jq | 커맨드라인 JSON 처리기. 모든 명령의 --json 출력에 활용. |
| 훅(hook) | 에이전트 동작의 특정 시점(도구 전/후·정지)에 끼어드는 스크립트. |
| 드리프트(drift) | 생성물(5dive 번들)과 소스(src/)가 어긋난 상태. CI가 git diff로 잡음. |
| 비서실장(CoS) | Chief of Staff 봇 — 에이전트마다 텔레그램 자식 봇을 자동 생성·관리하는 부모 봇. |
| 셀프호스팅 | 남의 클라우드가 아니라 내가 소유·관리하는 서버에서 직접 돌리는 것. |
| 5dive.yaml | 회사(여러 에이전트+역할+조직도+백로그)를 선언적으로 정의하는 파일. |
원본 저장소와, 각 개념을 더 깊이 팔 때의 출발점.