Live Mentions 딥다이브 · 2026-06-24

5dive 딥다이브
— 내 서버 한 대 위에 'AI 직원들로 굴러가는 회사'를 통째로 세우는 운영체제

5dive-ai/5dive"AI 에이전트들이 모인 회사를, 내가 소유한 서버 한 대에서 돌리는" 도구입니다. 이름 붙인 에이전트(claude, codex, grok…)를 각각 다른 모델·역할로 띄우고, 조직도(누가 누구에게 보고하는지)에 올린 뒤, 공유 할 일 목록(backlog)을 주면 서로 일을 주고받으며 자율적으로 일합니다. 그러다 사람만이 결정할 수 있는 순간이 오면 텔레그램으로 당신 휴대폰에 "탭 한 번으로 답하는" 버튼을 보냅니다. 놀라운 점은 거대한 서버 프레임워크가 아니라 셸 스크립트 한 덩어리(5dive CLI)가 전부라는 것 — 메시지 브로커도, 프로토콜도, 별도 오케스트레이터 서버도 없이 "공유 파일시스템 + 하나의 CLI"가 곧 버스(통신로) 역할을 합니다. 아직 별 14개의 초기 프로젝트지만, "멀티 에이전트 회사"라는 개념을 어떻게 최소한의 부품으로 실제 동작하게 만드는지 보여 주는 보기 드문 교본입니다. (저장소: 5dive-ai/5dive · Shell/TypeScript · ★14 · MIT)

목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

"직원을 한 명씩 채용하듯 AI 에이전트를 띄우고, 조직도와 할 일 목록만 쥐여 주면 알아서 굴러가는 '1인 사장의 회사 운영체제'."

한 줄로

5dive는 내가 가진 리눅스 서버 한 대를 '사무실'로 만들어, 그 안에 AI 직원(에이전트)들을 채용·배치하고 일을 시키는 운영 도구입니다.

각 에이전트는 리눅스 사용자 한 명 + 그가 24시간 켜 둔 AI CLI 세션(claude/codex/grok…) 하나입니다. 사람이 직원에게 사내 메신저로 일을 시키듯, 에이전트는 5dive 명령 하나로 서로에게 일을 넘깁니다. 그래서 별도의 중앙 서버나 통신 규약이 필요 없습니다 — 같은 서버의 파일시스템과 같은 CLI가 곧 '사내 인프라'입니다.

핵심 특징 셋: ① 조직도 + 공유 할 일 목록(누가 누구 밑에서 일하고, 어떤 일이 큐에 쌓여 있는지), ② 심장박동(heartbeat)(할 일이 있을 때만 에이전트를 깨워 토큰·비용을 아낌), ③ 사람에게 에스컬레이션(결정이 필요할 때만 텔레그램으로 탭 버튼을 보냄).

용어
에이전트(agent) · 에이전틱 CLI(agentic CLI)
여기서 에이전트는 "스스로 도구를 쓰고 명령을 실행하며 일을 해내는 AI 비서"입니다. 그 비서의 '두뇌'가 에이전틱 CLI — 터미널에서 도는 AI 프로그램(예: Claude Code의 claude, OpenAI의 codex, xAI의 grok)입니다. 5dive는 이런 CLI를 직접 만들지 않고, 이미 있는 공식 CLI들을 '직원처럼' 여러 명 띄워 묶어 주는 관리자 역할만 합니다.
용어
백로그(backlog) · 오케스트레이션(orchestration)
백로그는 "아직 처리하지 못한 할 일 목록"입니다(개발 현장에서 흔히 쓰는 말). 오케스트레이션은 오케스트라 지휘처럼 여러 일꾼의 작업 순서·역할을 조율하는 것을 뜻합니다. 5dive는 백로그(공유 작업 큐)와 조직도로 여러 에이전트를 조율하는데, 흥미롭게도 "지휘자 서버"를 따로 두지 않고 에이전트들이 같은 CLI를 호출하며 스스로 조율합니다.
용어
셀프호스팅(self-hosted) · systemd
셀프호스팅은 "남의 클라우드 서비스에 맡기지 않고, 내가 직접 소유·관리하는 서버에서 돌린다"는 뜻입니다. systemd는 리눅스에서 프로그램을 백그라운드 서비스로 항상 켜 두고 죽으면 자동 재시작하는 표준 관리자입니다(윈도우의 '서비스'와 비슷). 5dive의 각 에이전트는 systemd 서비스라, 터미널을 꺼도 계속 살아 있습니다.

구체적으로 5dive의 실체는 약 88만 바이트짜리 단일 셸 스크립트 5dive입니다. 이건 사람이 직접 쓴 게 아니라, 읽기 좋게 쪼개 둔 src/*.sh 조각들을 build.sh가 하나로 이어 붙여 만든 '번들'입니다(설치 시 서버에 파일 하나만 떨어뜨리기 위함). 그 위에 텔레그램 봇을 다루는 TypeScript 코드(cos-lib.ts 등)와, 에이전트의 동작을 가로채 텔레그램과 연결하는 훅(hook) 스크립트들이 얹혀 있습니다.

이 문서가 파고드는 건 "어떻게 설치하나"가 아니라 그 안의 설계입니다 — "브로커도 없이 에이전트들이 어떻게 서로 일을 넘기나", "할 일이 없을 때 토큰을 한 톨도 안 쓰게 만드는 heartbeat의 트릭은 무엇인가", "AI가 멋대로 일을 끝내지 못하게 막는 '사람 결재' 게이트는 어떻게 강제되나". 멀티 에이전트 시스템을 최소한의 부품으로 짓는 법을 배우려는 사람에게 작지만 밀도 높은 교본입니다.

2왜 주목받는가

"무거운 멀티 에이전트 프레임워크"가 넘쳐나는 시대에, 정반대로 '브로커 없는 최소 설계'를 택한 점.

요즘 "AI 에이전트 여러 개를 협업시키는" 도구는 넘쳐납니다. 그런데 5dive가 라이브 멘션을 타고 화제가 된 이유는 대부분이 복잡하게 푸는 문제를 의도적으로 단순하게 풀었기 때문입니다. 다섯 가지로 정리하면:

① 브로커·프로토콜·오케스트레이터가 '없다'

보통 멀티 에이전트 시스템은 메시지 큐(브로커), 통신 규약(프로토콜), 중앙 조율 서버(오케스트레이터)를 깝니다. 5dive의 README는 정반대로 못 박습니다 — "브로커도, 프로토콜도, 오케스트레이터도 없다. 공유 파일시스템과 공유 CLI뿐." 에이전트가 다른 에이전트에게 일을 시킬 때 그냥 5dive agent send <상대> "..."를 호출하면 됩니다. CLI 그 자체가 통신로(버스)인 셈입니다.

② "사람을 부를 때만" 깨운다 (heartbeat)

가장 영리한 비용 설계입니다. 에이전트를 늘 돌리면 토큰(돈)이 줄줄 새지만, 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인용 코딩 에이전트 CLI5dive는 그 claude여러 명 띄워 조직하고, 텔레그램·heartbeat·조직도·작업 큐를 얹는 '바깥 껍데기'다.
솔직한 주의점 — 공부 전에 알고 가기
1. 아주 초기 프로젝트다 (★14)

별 14개, 버전 0.1.x 단계입니다. "프로덕션에서 검증된 도구"라기보다 "제작사가 자기 회사를 실제로 이걸로 굴리며 다듬는 중인 초기 오픈소스"로 봐야 정확합니다(README도 "우리 회사를 이걸로 돌린다"고 명시). 일부 기능(예: loop 오케스트레이션의 여러 동사)은 코드에 "아직 미구현(WIP)"이라고 정직하게 적혀 있습니다.

2. "사람 없는 회사"는 마케팅 구호에 가깝다

토픽에 zero-human-company가 있지만, 실제 설계의 핵심은 오히려 "사람이 꼭 필요할 때만 개입한다"사람-결재 게이트입니다. 완전 무인이 아니라 "평소엔 자율, 결정은 사람"이 정확한 그림입니다.

3. AI에게 셸 접근을 준다는 본질적 위험

에이전트는 셸을 쓸 수 있는 리눅스 사용자입니다. README가 OS 패치·SSH 키 전용·방화벽 기본 차단·격리 티어·텔레그램 허용목록 같은 보안 위생을 권고하는 이유입니다. 격리를 제대로 안 걸면 위험할 수 있으니, 공부용은 반드시 도커나 일회용 VM에서 시작하세요.

3기술 스택 전체 지도

놀랍도록 단순하다 — 거대한 런타임 대신 셸 + 리눅스 기본기 + 약간의 TypeScript.

5dive는 웹 서비스가 아니라 '서버 위에서 도는 에이전트 관리자'라, 보통의 백엔드/프론트엔드 구분 대신 ① CLI 코어(셸) ② 런타임·인프라(리눅스/systemd) ③ 채널·연동(TypeScript/훅)으로 나눠 보는 게 자연스럽습니다.

① CLI 코어 — Bash (본체)

한눈에

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 기록 저장. 서버 없이 파일 하나로 동작, 자체 락으로 동시 쓰기 정리.
cron5dive heartbeat tick(주기적 깨우기)·standup 다이제스트·자동 업데이트의 구동기.
jqJSON 파싱/조립. 모든 명령이 --json 출력을 지원하는 비결.

③ 채널 · 연동 — TypeScript + 훅

구성요소역할
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.shsrc/*.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은 이미 모든 리눅스에 있는 '국민 부품'이라, 의존성을 최소화하면 설치가 단순해지고 보안 표면도 줄어듭니다. "최소한의 새 부품으로 푼다"는 철학이 스택 선택에 그대로 드러납니다.

4아키텍처 심화 분석

"공유 파일시스템 + 하나의 CLI = 버스." 중앙 서버가 없다는 게 곧 아키텍처다.

전체 구조의 핵심은 "각 에이전트는 독립된 리눅스 사용자 + 항상 켜진 AI CLI이고, 그들을 잇는 끈은 ① 같은 서버의 공유 파일(특히 sqlite 작업 큐)과 ② 같은 5dive CLI 호출뿐"입니다. 그림으로 보면:

사람(사장) — 휴대폰 │ 텔레그램: 탭-투-앤서 버튼 ▼ ┌──────────────────────── 서버 한 대 (리눅스 + systemd) ────────────────────────┐ │ │ │ 에이전트 = 리눅스 사용자 1명 + tmux 안에서 도는 AI CLI 1개 (systemd 서비스) │ │ │ │ ┌─ agent-coder ─┐ ┌─ agent-writer ─┐ ┌──── agent-pm ────┐ │ │ │ user: agent- │ │ user: agent- │ │ user: agent-pm │ │ │ │ coder │ │ writer │ │ (claude, opus) │ │ │ │ (claude) │ │ (codex) │ │ 조직도상 '상사' │ │ │ │ tmux 세션 ● │ │ tmux 세션 ● │ │ tmux 세션 ● │ │ │ └──────┬────────┘ └───────┬────────┘ └────────┬─────────┘ │ │ │ │ │ │ │ └──── 5dive CLI 호출 (send · ask · task · org) ────┘ │ │ = 이것이 곧 '버스' │ │ │ │ │ ┌─────────────────────────────┼──────────────────────────────┐ │ │ ▼ ▼ ▼ │ │ 공유 작업 큐 조직도(org) 심장박동(heartbeat) │ │ SQLite: tasks SQLite: reports cron 한 대가 주기적 │ │ add/assign/start/done 누가 누구 밑인지 으로 tick → 할 일 있는 │ │ DIVE-1, DIVE-2 … (reports_to) 에이전트만 1개씩 깨움 │ │ │ │ 훅(hooks/*.sh): 에이전트 행동을 가로채 텔레그램과 연결 (질문 전달·실패 알림·미러링) │ └──────────────────────────────────────────────────────────────────────────────┘ ↕ 인증 토큰은 모델 제공사로 '직접' (Anthropic / OpenAI / xAI …) — 5dive를 거치지 않음 빌드: src/header.sh + src/lib/*.sh + src/cmd_*.sh + src/main.sh ──build.sh──▶ 단일 `5dive` 번들

한 작업의 일생 — end-to-end 흐름 따라가기

"새 작업이 큐에 들어옴 → 에이전트에 배정 → 작업 → 막히면 사람 호출 → 사람이 답 → 재개"를 파일·컴포넌트 단위로 추적해 봅시다.

STEP 1 · 작업이 큐에 들어온다

사장(또는 상사 에이전트)이 할 일을 등록합니다. src/cmd_task.sh공유 SQLite 작업 테이블(src/lib/tasks_db.sh)에 한 줄을 넣고 DIVE-42 같은 식별자를 발급합니다. 반복 작업이면 cron 일정(--recurring)으로 매번 자동 생성됩니다.

5dive task add "어젯밤 CI 실패 분류" --assignee=ops --recurring="0 7 * * *"
STEP 2 · 심장박동이 '할 일 있는' 에이전트만 깨운다

서버의 cron이 몇 분마다 5dive heartbeat tick(src/cmd_heartbeat.sh)을 호출합니다. tick은 등록된 에이전트마다 딱 한 가지를 묻습니다 — "이 에이전트 앞으로 'todo' 상태인 작업이 큐에 있나?"

"틱 한 번 = 작업 하나"가 핵심 규율입니다. 다음 작업은 다음 틱이 가져갑니다. 게다가 폭주 방지 장치까지 있습니다 — 너무 오래 in_progress인 작업은 리퍼(reaper)가 강제로 큐에 되돌리고, 여러 번 넛지해도 시작조차 안 되는 작업은 '굶주림(starvation)'으로 감지해 사람에게 surface합니다.

STEP 3 · 깨어난 에이전트가 일한다 (필요하면 동료를 부른다)

넛지를 받은 에이전트(예: 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 세션에 키를 직접 입력하는 방식입니다.

STEP 4 · 사람만이 결정할 일에 막힌다 → 작업을 사람에게 '주차'

에이전트가 "출시할까 말까" 같은 결정에 부딪히면, 작업을 사람에게 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·ExitPlanModehooks/pretool-telegram-question.sh막고, 대신 "번호로 된 보기를 일반 메시지로 보내라"고 지시합니다.)

STEP 5 · 사람이 답하면 → 막힌 에이전트가 풀려 재개

당신이 버튼을 탭하면 5dive task answer DIVE-42가 실행돼 답이 큐에 기록되고, 작업이 blocked에서 풀립니다. 다음 heartbeat 틱에서 주인 에이전트가 다시 깨어나 이어서 일하고 5dive task done으로 마무리합니다. 5dive task inbox는 "사람을 기다리는 모든 작업"을, 5dive org tree는 조직도를 보여 줍니다.

핵심 설계 패턴 5가지

① "CLI가 곧 버스" (브로커 없는 메시지 전달)

에이전트 간 통신을 위해 메시지 큐를 깔지 않습니다. 대신 같은 5dive CLI를 호출하면, 그 명령이 상대 에이전트의 tmux 세션에 send-keys로 글자를 넣어 줍니다. "통신로를 새로 만들지 말고, 이미 있는 것(공유 파일 + 공유 실행파일)을 통신로로 쓰자"는 발상입니다.

② "할 일 있을 때만 깨우는" 비용 게이트 (heartbeat)

늘 켜 두면 비싸고, 완전히 꺼 두면 일을 못 합니다. 5dive는 그 사이를 "큐에 내 작업이 있을 때만 깨어난다"로 해결합니다. 깨우는 주기(everyMin)는 '실제로 깨어난 사이의 최소 간격'이라, cron이 더 자주 돌아도 일 없는 에이전트는 값싼 sqlite 카운트만 한 번 더 할 뿐 비용이 안 듭니다.

③ 단일 번들 + 드리프트 검사 (빌드 규율)

읽기 좋은 src/*.sh와 배포용 단일 5dive가 어긋나면 사고가 납니다. 그래서 build.sh로 항상 다시 빌드하고, CI가 git diff로 "소스만 고치고 번들을 안 고쳤거나 그 반대"인 경우를 잡아냅니다. 순서도 엄격합니다 — header.sh(전역 변수)는 맨 앞, main.sh(종료 트랩 + main "$@")는 맨 뒤.

④ OS 수준 격리 (전략 패턴 같은 보안)

에이전트마다 다른 리눅스 사용자를 만들고 systemd 유닛에 권한·자원 제한을 건 뒤, admin/standard/sandboxed 중 한 티어를 적용합니다. "샌드박스 에이전트는 홈 못 읽고 sudo 못 함" 같은 보장이 애플리케이션 코드가 아니라 OS에서 강제됩니다 — 훨씬 깨기 어려운 방어선입니다.

⑤ 사람-결재 게이트의 '진짜 사람' 증명 (gate-proof)

AI가 자기 결재를 스스로 통과시키면 의미가 없습니다. 그래서 approval·secret 게이트는 에이전트 계정(agent-*)으로는 막혀 있고(DIVE-519), 켜 두면 루트만 발급할 수 있는 '사람 출처 증명 토큰'(5dive gate-proof)이 있어야 통과됩니다. "결정의 최종 권한은 사람"을 코드로 못 박은 영리한 설계입니다.

설계에서 배울 점
"새 부품을 만들지 말고, 있는 부품을 통신로·격리·스케줄러로 재활용한다"

5dive의 거의 모든 영리함은 "이미 검증된 OS 기본기(리눅스 사용자·systemd·tmux·sqlite·cron)를 조합해 멀티 에이전트 문제를 푼다"로 요약됩니다. 메시지 버스가 필요하면 CLI 호출 + tmux로, 항상 켜기가 필요하면 systemd로, 비용 절약이 필요하면 cron + 큐 카운트로, 격리가 필요하면 리눅스 사용자 권한으로. "바퀴를 다시 발명하지 않는다"는 엔지니어링 절제의 좋은 본보기입니다.

5디렉토리 구조 해부

진짜 로직은 전부 src/ 아래 셸 조각들. 루트의 5dive는 그것들을 이어붙인 '완성품'일 뿐.

5dive/ ├── 5dive 882KB — 배포용 단일 셸 번들(src/*를 이어붙인 완성품) ├── 5dive-agent-start 49KB — 에이전트별 tmux 세션 기동기(systemd가 호출) ├── 5dive-refresh-plugins.sh claude 플러그인 SHA 갱신 도우미 ├── build.sh src/*.sh ─▶ 5dive 번들로 합치는 빌드 스크립트 ├── install.sh 27KB — 한 줄 설치기(의존성·systemd·훅·스킬 배치) ├── cos-lib.ts / cos-runner.ts 비서실장(CoS) 봇 — 텔레그램 자식봇 자동 생성(TS) ├── CHANGELOG.md 64KB — 매우 상세한 개발 일지(DIVE-N 단위 기록) ├── README.md 15KB — 사실상의 설계 개요 ├── projects-CLAUDE.md / telegram-agent-CLAUDE.md — 에이전트에 주입되는 기본 지침 │ ├── src/ ← ★ 진짜 소스(셸). 여기만 편집, 번들은 빌드로 생성 │ ├── header.sh 전역 변수·set -euo pipefail (번들 맨 앞) │ ├── main.sh 명령 분배 + 종료 트랩 + main "$@" (번들 맨 뒤) │ ├── lib/ │ │ ├── tasks_db.sh 공유 SQLite 작업 큐 스키마/연산 │ │ ├── registry.sh 에이전트 레지스터(+ 동시성 락 with_registry_lock) │ │ ├── state.sh · audit.sh 상태 디렉토리 · 감사 로그(NDJSON) │ │ ├── agent_setup.sh 에이전트 생성/배선 공통 로직 │ │ ├── validation.sh · output.sh · error_codes.sh │ │ └── (이름·인자 검증 / JSON 출력 / 종료코드 표) │ ├── cmd_agent.sh create/start/stop/send/ask/pair … 에이전트 명령 │ ├── cmd_task.sh add/ls/assign/need/inbox/answer … 작업 큐 명령 │ ├── cmd_heartbeat.sh "할 일 있을 때만 깨우기" 스케줄러(틱·리퍼·굶주림) │ ├── cmd_org.sh 조직도(reports_to) set/tree │ ├── cmd_compose.sh 5dive.yaml 선언형 up/down/ps/export │ ├── cmd_account.sh / cmd_auth.sh 공유 인증 프로파일 · 저수준 인증 │ ├── cmd_cos.sh 비서실장 봇 명령(verify/mint-link/claim/rotate) │ ├── cmd_loop.sh LOOP-7 멀티 에이전트 오케스트레이션(일부 WIP) │ ├── cmd_doctor.sh 건강검진(의존성·인증·레지스터 정합성, --repair) │ ├── cmd_watch.sh htop 스타일 실시간 에이전트 보드 │ └── cmd_hire/skill/init/project/digest/fleet/usage/selfupdate.sh │ ├── systemd/ │ ├── 5dive-agent@.service 에이전트 서비스 템플릿(User=agent-%i, 종료 처리) │ └── 5dive-hermes-perms.{path,service} hermes 권한 워치독 ├── hooks/ ← 에이전트 행동 가로채기(텔레그램 연결) │ ├── pretool-telegram-question.sh tmux 전용 질문 UI 차단→텔레그램 메시지로 │ ├── stop-failure-telegram.sh 실패 시 알림 │ ├── posttool-telegram-relay.sh 도구 결과 릴레이 │ ├── stop-mirror-inter-agent.sh 에이전트끼리 대화 미러링 │ └── resume-after-reset.sh · push-notify.sh … ├── team-templates/ ← 통째로 가져오는 '회사' 템플릿 │ ├── startup.5dive.yaml CEO+CMO+DevOps+리서처+크리에이티브 5인 창업팀 │ ├── content-studio.5dive.yaml 편집장+작가+SEO+디자이너+배포 5인 콘텐츠팀 │ ├── index.json 템플릿 레지스터 · SCHEMA-v2.md(yaml 스키마) ├── skills/notify-user/SKILL.md 에이전트용 '사용자에게 알리기' 스킬 ├── docker/Dockerfile 호스트 없이 시험 운전용 이미지 └── docs/ · tests/ · CONTRIBUTING.md

읽는 순서를 추천하자면: README.md(전체 개념) → src/main.sh(어떤 명령들이 있고 어떻게 분배되는지 한눈에) → src/cmd_heartbeat.sh 상단 주석(비용 설계의 핵심) → systemd/5dive-agent@.service + 5dive-agent-start(에이전트가 실제로 어떻게 뜨는지) → src/cmd_task.sh(작업·사람결재 흐름) 순입니다. 루트의 거대한 5dive 파일은 자동 생성물이니 직접 읽지 말고 src/를 보세요.

6학습 포인트 (기술별)

이 저장소의 진짜 가치는 "멀티 에이전트 + 견고한 셸 시스템 프로그래밍"을 한곳에서 코드로 볼 수 있다는 것.

① 견고한 Bash 시스템 프로그래밍 — src/main.sh · lib/

"셸 스크립트는 대충 짜는 것"이라는 편견을 깨는 코드입니다. set -euo pipefail(오류·미정의 변수·파이프 실패에 즉시 중단), 종료 트랩으로 모든 경로가 감사 로그를 남기게 하기, 레지스터 락(with_registry_lock)으로 대시보드 동시 클릭의 경쟁 상태(race) 막기, 종료코드 표(0=ok, 4=not_found, 6=auth_required…)를 --json 에러와 일치시키기 — "셸로도 신뢰성 있는 도구를 만들 수 있다"는 모범을 보여 줍니다.

② "있는 것을 통신로로" — 에이전트 간 메시지 전달

cmd_agent.shsend/ask가 백미입니다. 상대 에이전트의 tmux 세션에 send-keys로 글자를 주입하고, ask는 그 뒤 화면 스크롤백이 더 이상 안 자랄 때까지 폴링해 답을 긁어옵니다. "메시지 큐 없이 동기 RPC 흉내 내기"의 실전 예시입니다. 받는 쪽엔 [5dive-msg from=<보낸이>] 꼬리표가 자동으로 붙습니다.

③ 비용을 0으로 만드는 스케줄러 — cmd_heartbeat.sh

이 파일의 상단 주석만 읽어도 큰 공부가 됩니다. "틱은 자주, 깨움은 드물게"(체크는 매 틱, 비용은 실제 깨울 때만), 리퍼(폭주하는 작업 강제 회수), 굶주림 감지(넛지해도 안 시작되는 작업 surface), 고아 회수(claude 프로세스가 죽어 주인 없는 작업 되돌리기) 등 "자율 에이전트가 멈추거나 폭주할 때"를 다루는 방어 코드가 촘촘합니다.

# heartbeat tick의 핵심 분기(요지)
no todo            -> do nothing      # 안 깨움 = 토큰 0
already in_progress -> skip            # 두 번 찌르면 일이 엉킴
has todo + due      -> /clear + 넛지 1개 # "한 작업만 하고 쉬어라"

④ systemd 유닛을 제대로 쓰는 법 — 5dive-agent@.service

템플릿 유닛(@로 인스턴스화 → User=agent-%i), 여러 EnvironmentFile로 인증·채널 환경을 겹쳐 주입, Restart=on-failure로 자동 부활. 특히 ExecStop 주석은 보석입니다 — "antigravity의 agy 바이너리는 SIGTERM을 무시하고 SIGHUP에만 죽는다"는 실전 디버깅이 그대로 코드에 남아, 종료 시간을 60초에서 0.05초로 줄인 사연이 적혀 있습니다.

⑤ 텔레그램 연결과 라이프사이클 훅 — hooks/

에이전트의 동작 지점(도구 사용 전/후, 정지 시)에 끼어드는 패턴을 통째로 볼 수 있습니다. 백미는 pretool-telegram-question.shtmux에서만 보이는 질문 UI(AskUserQuestion)를 막고, "그 UI는 텔레그램 사용자가 못 보니, 질문을 번호 매긴 일반 메시지로 보내라"고 에이전트에게 되돌려 줍니다. "AI의 출력 형식을 채널에 맞게 교정하는" 영리한 중간 계층입니다.

⑥ 선언형 회사 구성 — team-templates/*.yaml

5dive.yaml 하나로 여러 에이전트 + 역할 + 조직도 + 시작 백로그를 선언하고 5dive up으로 한 번에 띄웁니다(도커 컴포즈와 닮음). reports_to조직 진실의 단일 출처라, 거기서 조직도 엣지와 각 에이전트의 CLAUDE.md에 붙는 "## 보고 라인" 섹션("당신의 상사는 누구, 부하는 누구, 이렇게 연락하라")을 자동 생성합니다 — 위임이 장식이 아니라 실제로 동작하게 만드는 부분입니다.

⑦ 텔레그램 Bot API 자동화 — cos-lib.ts

유일한 큰 TypeScript 조각입니다. 텔레그램 Bot API 9.6의 "관리형 봇"으로, 고객 소유의 '비서실장 봇'이 에이전트마다 자식 봇을 자동 생성·설정(이름·설명·아바타)·토큰 회전하게 합니다. 부수효과를 최소화한 순수 함수로 짜 단위 테스트가 가능하게 한 점, "avatar 업로드는 multipart attach:// 래퍼가 필요하다" 같은 API 함정 주석이 학습 포인트입니다.

⑧ 단일 바이너리 빌드 + 드리프트 CI — build.sh

"소스는 쪼개 읽고, 배포는 한 파일로"를 어떻게 안전하게 유지하는지 보여 줍니다. cat 순서를 엄격히 지키고(전역 먼저, main 마지막), CI가 ./build.sh && git diff --exit-code 5dive로 양방향 드리프트를 잡습니다. 생성물과 소스의 동기화를 사람 기억이 아니라 자동화로 보장하는 좋은 패턴입니다.

⑨ 사람-결재 게이트의 권한 분리 — gate-proof · 격리 티어

"AI가 자기 승인을 스스로 통과시키지 못하게" 만드는 법을 보여 줍니다. approval/secret 게이트는 에이전트 UID로는 막혀 있고, 루트만 발급하는 사람-출처 증명 토큰이 있어야 통과됩니다. 격리 티어(admin/standard/sandboxed)와 함께, "신뢰 경계를 OS 권한으로 그린다"는 보안 사고법을 배울 수 있습니다.

7시스템 요구사항

서버급 하드웨어가 필요한 게 아니다 — 핵심은 "리눅스 + 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로 나가는 연결. 인증 토큰은 제공사로 직접.
메모리/CPU5dive 자체는 가벼움(셸+sqlite). 실제 부하는 동시에 띄운 AI CLI 세션 수에 비례 — 에이전트 1~몇 명이면 소형 VPS로도 충분.
도커 경로systemd/루트/리눅스가 없으면 docker build -f docker/Dockerfile--privileged로 실행(컨테이너 안에서 systemd를 쓰기 위함).
현실적인 조언

공부가 목적이라면 내 메인 서버에 바로 깔지 말고, 일회용 VM이나 도커 컨테이너에서 시작하세요. 에이전트는 셸을 쓸 수 있으니, 잘못 설정하면 위험합니다. 무료/저가 Ubuntu VPS 하나에 에이전트 1명만 띄워 "작업 큐에 일을 넣으면 heartbeat가 깨우고, 막히면 텔레그램으로 묻는" 한 사이클만 돌려 봐도 이 시스템의 핵심을 체감할 수 있습니다.

8직접 해볼 수 있는 실습 과제

읽기만 하면 금방 잊는다. 난이도별로 손을 움직여 보자. (모두 일회용 VM/도커에서!)

실습 1 · 난이도 ★☆☆ 입문

도커로 띄우고 에이전트 한 명에게 인사 받기

docker build -f docker/Dockerfile -t 5dive .--privileged로 실행해 들어간 뒤, 5dive init 마법사로 에이전트 하나를 만들고 텔레그램으로 첫 메시지를 받아 보세요. 목표는 결과물이 아니라 "설치→인증→생성→hello가 도는 걸 내 눈으로 보는 것"입니다.

관찰: 5dive agent list로 상태(active)를 확인하고, 5dive watch로 실시간 보드를 띄워 보기.
실습 2 · 난이도 ★☆☆ 입문

명령 분배 지도 읽기 — src/main.sh 정독

코드를 한 줄도 안 돌려도 됩니다. src/main.shcase "$top" in ... 분배 표를 읽으며 어떤 명령이 있고, 어떤 게 루트가 필요하며(require_root), 어떤 게 레지스터 락(with_registry_lock)을 잡는지 표로 정리해 보세요. "잘 짠 CLI의 골격"이 한눈에 들어옵니다.

질문: 왜 task·org는 락 없이 돌고(힌트: sqlite 자체 락), agent create는 락을 잡을까?
실습 3 · 난이도 ★★☆ 중급

작업 큐 + heartbeat 한 사이클 돌리기

에이전트 하나에 5dive task add "..." --assignee=<이름>로 일을 넣고, 5dive heartbeat on <이름> --every=5m5dive heartbeat tick을 직접 호출해 "할 일이 있을 때만 깨어나는지"를 확인하세요. 할 일이 없을 때는 tick이 아무 일도 안 하는 것도 관찰합니다.

실험: 작업을 일부러 in_progress로 두고 오래 방치하면, 리퍼가 언제 그것을 큐로 되돌리는가? (_HB_STALE_* 상수 참고)
실습 4 · 난이도 ★★☆ 중급

두 에이전트가 서로 일을 넘기게 하기

에이전트 둘(예: 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는 답이 올 때까지 어떻게 기다리나?
실습 5 · 난이도 ★★★ 고급

사람-결재 게이트 + 텔레그램 탭 버튼 흐름 완성

5dive task need DIVE-N --type=approval --ask="..." --options="A|B" --recommend=A로 작업을 사람에게 park하고, 텔레그램에 탭 버튼이 도착하는지 확인하세요. 버튼을 눌러(또는 5dive task answer로) 막힌 에이전트가 풀려 재개되는 전 과정을 추적합니다.

탐구: 5dive gate-proof enforce on 후, 에이전트 계정으로 직접 task answer를 시도하면 왜 거부되는가? (사람-출처 증명의 의미)
실습 6 · 난이도 ★★★ 고급

회사 템플릿을 선언형으로 띄우고 export로 되뽑기

5dive team import startup(또는 직접 쓴 5dive.yaml + 5dive up)으로 5인 팀을 한 번에 올리고, 각 에이전트의 ~/.claude/CLAUDE.md자동 생성된 "## 보고 라인"이 들어갔는지 확인하세요. 그다음 5dive export로 살아 있는 조직을 다시 5dive.yaml로 덤프해 봅니다(round-trip).

관찰: reports_to 하나가 어떻게 ① 조직도 엣지 ② CLAUDE.md 보고 섹션 ③ 시작 백로그(goals)로 동시에 펼쳐지는가?

9관련 기술 심화 학습 로드맵

이 저장소를 '교과서'로 삼아 6주간 "멀티 에이전트 + 셸 시스템 설계"를 정복하는 코스.

주차주제이 저장소에서 볼 곳 + 곁들일 자료
1주견고한 Bash 시스템 프로그래밍src/main.sh·lib/*.shset -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단계를 코드로 따라가며 직접 한 사이클 돌려 보는 게 가장 빠른 길입니다.

10핵심 키워드 사전

이 문서·저장소에 나온 용어를 한 줄씩 정리. 모르면 여기로 돌아오기.

용어한 줄 뜻
에이전트(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회사(여러 에이전트+역할+조직도+백로그)를 선언적으로 정의하는 파일.

11참고 링크

원본 저장소와, 각 개념을 더 깊이 팔 때의 출발점.