Skip to content

Repository files navigation

Crew — 로컬 멀티 에이전트 데스크톱

Crew

이미 쓰고 있는 Grok / Claude Code / Codex CLI를 하나의 창 안에 봇으로 모아 주는 맥 앱이에요. 모델 API를 새로 붙이는 대신, CLI를 헤드리스로 실행하고 그 답변만 말풍선으로 보여줘요.

설치 스크립트나 GitHub Releases의 .dmg로 설치할 수 있고, 설치된 앱은 새 버전이 나오면 직접 업데이트해요.

Crew 채팅 창 — 봇과 채널, @멘션, 핸드오프

새 봇 만들기 — 이름, 역할, Grok/Claude/Codex, 모델, 아바타

루틴 설정 — 예약된 일, 말로 추가, 매일·평일·매주 피커


만든 이유

에이전트 세션 하나를 사람 하나로 봐요. 리뷰는 Claude, 구현은 Grok, 나머지는 Codex처럼 전문가를 만들어 두고, 회사처럼 한 창에서 협업하게 하는 프로그램이에요. 창을 여러 개 띄워 놓고 한 쪽 결과를 다른 쪽에 복사해 넘기던 일을, 다른 전문가에게 일을 맡기는 걸로 바꿔 줘요.

Grok의 봇 기능에서 영감을 받았어요. 성격과 역할을 지정한 봇을 만들어 두고 필요할 때 @로 부르는 방식이 좋았는데, 정작 손이 많이 가는 일은 터미널의 에이전트 CLI가 하고 있었거든요. 그래서 그 경험을 그대로 로컬 CLI 위에 올려 봤어요.

이미 쓰는 CLI를 데스크톱 안에 모아 두면:

  • 1:1로 한 봇과 대화하거나
  • 채널에 여러 봇을 모아 두고 @이름으로 부르거나
  • 봇이 crew tell로 다른 봇에게 직접 일을 넘기거나
  • 정해 둔 시각에 루틴이 채널이나 봇에게 일을 맡기게 할 수 있어요

컨셉

봇

봇 하나는 agents.json의 한 항목이에요. 이름, 역할, 작업 폴더, 모델, 아바타를 갖고 있고, 메시지를 받으면 그 봇에 지정된 cmd를 실행해요.

기본 명령은 각 CLI의 승인 프롬프트를 건너뛰도록 되어 있어요. 데스크톱 채팅이 TUI 권한 화면에서 멈추지 않게 하기 위해서인데, 이 플래그가 어디까지 허용하는지는 알고 쓰는 편이 좋아요.

CLI 기본 cmd
Grok grok --always-approve
Claude claude --dangerously-skip-permissions
Codex codex --yolo

Grok / Claude / Codex는 턴 단위 헤드리스로 실행돼요. -p / exec의 스트리밍 JSON만 읽기 때문에 배너나 스피너, 단축키 안내가 말풍선에 섞이지 않아요. CLI 세션 id는 봇별로 보관하니까 대화를 이어서 할 수 있고, 대화를 지우면 새 세션이 열려요.

cat 같은 스텁은 예외로 긴 PTY 세션으로 유지해요. 테스트나 간단한 에코 봇에 쓰면 돼요.

채널

채널에는 멤버 봇, 브리프, 최근 대화가 있어요. 메시지를 보내면 Crew가 누가 답할 차례인지 정해 줘요.

  • @이름 / @id → 그 멤버가
  • @everyone / @all / @here / @channel → 전원이
  • 멘션이 없으면 → 마지막으로 답한 멤버가, 그마저 없으면 첫 번째 멤버가
  • 봇이 멘션 없이 채널에 글을 남기면 → 아무도 답하지 않아요. 봇끼리 끝없이 주고받지 않도록요

호출된 봇에게는 채널 이름, 멤버 id, 브리프, 최근 대화 몇 줄이 함께 전달돼요.

채널은 봇도 만들 수 있어요. "이 멤버 그대로 다른 방 하나 파 줘" 처럼 부탁하면, 봇이 crew channel list로 지금 방 멤버를 확인하고 crew channel add로 새 방을 열어요. 새 방에 브리프를 넣어 두면 그 방에서 깨어나는 멤버마다 그 룰을 같이 받아요. 방은 멤버가 아니면 글을 못 올리니까 봇이 그 방에서 말할 거면 자기 id도 멤버에 넣어야 하고, 봇이 올린 첫 글에 @멤버나 @everyone이 있어야 일이 시작돼요.

핸드오프

세션마다 CREW_AGENT_ID와 확장된 PATH가 들어가요. 시스템 프롬프트는 대략 이렇게 알려 줘요.

사용자가 @id를 쓰면 그건 너에게 다른 봇을 가리키는 것이다. 이 세션에 남아라. 필요하면 직접 crew tell <id> <text>를 실행해라. 이름을 바꿔 달라면 crew agent set --name "새 이름"을 실행해라. 반복 일을 맡기면 crew routine add로 루틴을 만들어라. 사람에게 고르라고 물으려면 crew ask --question "..." --option A --option B를 실행해라. 값을 적으라고 하려면 --input 아이디를 보태라. 다른 봇에게 묻지 마라.

그래서 1:1 대화에서 @리뷰어 이 패치 봐줘라고 쓰면, 지금 대화 중인 봇이 먼저 일을 하고 필요할 때 리뷰어 봇에게 넘겨요. 봇 사이의 릴레이는 사용자 메시지 하나당 최대 4홉이에요. 이름 변경과 루틴 등록은 채팅에서 시키면 봇이 같은 식으로 crew를 실행해요. 사람에게 A / B / C를 고르라고 묻거나 값을 적으라고 할 때도 crew ask로 그 봇의 채팅에 카드가 떠요.

메모리

대화 기록은 지우면 아카이브로 옮겨가지만, $CREW_HOME/memory/<id>.md는 그대로 남아요. 다음 턴에 Grok은 --rules로, Claude는 --append-system-prompt로, Codex는 -c developer_instructions=로 다시 넣어 줘요. 봇을 복제하면 메모리도 함께 복사되고, 봇을 삭제하면 메모리 파일도 같이 지워져요.


주요 기능

채팅

  • 봇·채널 사이드바, 그룹, 드래그 앤 드롭, 검색 (⌘K)
  • 스트리밍 말풍선, 연속 답변 분리, 마크다운, 로컬 이미지·파일 경로
  • @멘션 칩, 파일 첨부, /스킬 문구 삽입
  • 봇이 작업 중일 때 보낸 메시지는 순서대로 대기해요. 봇당 최대 32개
  • 중지 (⌘. 또는 stop / 중지 / 멈춰). 확인이 필요할 땐 한 번 허용 / 거부
  • 봇이 사람에게 고르거나 값을 적으라고 물으면 (crew ask) 그 채팅에 카드가 떠요. 고른 답이나 적은 값이 봇에게 돌아와요. 다른 봇에게 묻지 않아요
  • 도구 호출은 접힌 카드로 보여 주고, 긴 핸드오프도 접을 수 있어요
  • 읽지 않은 대화 표시, Dock 배지, 작업 완료·차단·루틴 실패 알림

봇

  • Grok / Claude / Codex 중에서 선택. 모델·생각(effort)·역할·작업 폴더 설정
  • Grok Bot 스타일의 도형 아바타 (원, 물방울, 둥근 사각형, 육각형, 삼각형, 구름, 알약, 다이아몬드, 오각형, 별, 하트) + 색상. 사진으로 바꿀 수도 있어요
  • 작업 중에는 궤도 애니메이션, 확인을 기다릴 땐 회전 링
  • 복제, 대화 지우기 (루틴도 함께 지울지 선택), 삭제

채널

  • 멤버·이름·브리프 설정
  • 채널 전용 루틴. 주소는 #채널이름
  • 채널에서 작업 중인 멤버 확인. 알림을 누르면 그 채널로 이동해요

루틴

  • 5필드 cron, 또는 평일 8시에 브리핑 같은 한글/영어 문장
  • 매일 / 평일 / 매주 / 매시 피커, 지금 실행, 일시정지, 최근 실행 기록
  • 실패한 실행도 그 분(minute)의 슬롯을 쓴 것으로 쳐요. 같은 분에 다시 실행되지 않도록요

스킬

  • 설정에서 이름과 본문을 마크다운으로 저장 ($CREW_HOME/skills/<이름>.md)
  • 입력창에 /이름을 치면 본문이 들어가요

앱

  • 한국어 / English
  • 다크 / 라이트 / 시스템 (맥 외관 설정)
  • 단축키 오버레이 (⌘/, 또는 입력창 밖에서 ?)
  • macOS 자동 업데이트 — 새 버전을 알려 주고, 적용 시점은 설정에서 고를 수 있어요

요구 사항

항목 내용
OS macOS (Unix 소켓, ~/Library/Application Support, 트래픽 라이트 타이틀바)
에이전트 CLI grok, claude, codex 중 쓸 것만. Crew는 모델을 내장하지 않아요

에이전트 CLI 바이너리는 아래 경로에서도 찾아요.

~/.grok/bin, ~/.local/bin, ~/.cargo/bin, /opt/homebrew/bin, /usr/local/bin


설치

한 줄로 설치할 수 있어요. 최신 릴리스 DMG를 받아 /Applications/Crew.app에 복사하고 quarantine 속성을 제거해요.

설치 스크립트

curl -fsSL https://raw.githubusercontent.com/im-ian/crew/main/scripts/install-macos.sh | bash

~/.local/bin/crew에 CLI 심볼릭 링크도 만들어 줘요. 위치를 바꾸려면 CREW_INSTALL_DIR를 지정:

curl -fsSL https://raw.githubusercontent.com/im-ian/crew/main/scripts/install-macos.sh \
  | CREW_INSTALL_DIR="$HOME/Applications" bash

수동 DMG

Releases에서 Crew_*_aarch64.dmg(Apple Silicon) 또는 Crew_*_x64.dmg(Intel)를 받아 Applications로 복사한 뒤 quarantine 속성 제거:

xattr -dr com.apple.quarantine /Applications/Crew.app

Crew는 Apple Developer ID로 서명·공증되지 않은 ad-hoc 빌드입니다. 위 명령은 Gatekeeper의 quarantine 플래그만 떼는 단계로 앱 무결성에는 영향이 없습니다.

설치된 앱은 시작 시와 설정에서 업데이트를 확인해요. 새 버전은 사용자가 설치를 고른 뒤에만 받아 다시 실행합니다.


소스에서 빌드

미리 빌드된 앱 대신 저장소를 받아서 직접 빌드할 수도 있어요. 요구사항은 Rust stable (rustup, rustc 1.95에서 확인), Node.js 20+, Xcode Command Line Tools예요.

1. 도구

# Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

# Xcode Command Line Tools (아직 없다면)
xcode-select --install

Node는 nodejs.org에서 받거나 brew install node로 설치하면 돼요.

2. 에이전트 CLI (필요한 것만)

각 도구의 공식 설치 방법을 따른 뒤, 터미널에서 해당 명령이 실행되는지만 확인하면 돼요.

grok --version
claude --version
codex --version

3. Crew 빌드

저장소에서 빌드

git clone https://github.com/im-ian/crew.git
cd crew
cargo build --release -p crew

바이너리: target/release/crew

macOS .app / .dmg는 다음으로 만들어요. 서명 키가 없으면 업데이터 아티팩트 없이 호스트 아키텍처 번들만 나와요.

./scripts/build-macos.sh

PATH에 넣으려면:

install -m 755 target/release/crew "$HOME/.local/bin/crew"
# 또는
cargo install --path crates/crew --locked

cargo install은 ~/.cargo/bin/crew에 설치해요. rustup으로 설치했다면 이미 PATH에 잡혀 있어요.

Git에서 바로 설치

cargo install --git https://github.com/im-ian/crew.git --locked crew

두 방법 모두 build.rs가 crates/crew/ui에서 npm install과 npm run build를 실행해요. 첫 빌드는 Node 의존성 때문에 시간이 좀 더 걸려요.

4. 실행

crew

인자 없이 실행하거나 crew app을 쓰면 데스크톱 창이 열려요. 데몬이 떠 있지 않으면 같은 바이너리가 백그라운드 데몬을 함께 띄워요.

창만 닫으면 데몬은 남아 있을 수 있어요. 완전히 종료하려면:

crew stop

창은 한 번에 하나예요. 이미 실행 중인 Crew가 있다면 먼저 종료하고 다시 여는 편이 안전해요.


첫 실행

데이터 홈은 기본적으로 여기예요.

~/Library/Application Support/crew

CREW_HOME을 지정하면 그 디렉터리를 사용해요.

agents.json이 아직 없으면 저장소의 agents.example.json을 복사해서 시작해요. 예시 로스터는 이래요.

id 이름 명령 작업 폴더
grok Grok grok --always-approve /tmp/crew-demo/grok
shell Shell cat /tmp/crew-demo/shell

examples 블록의 Claude / Codex는 참고용이라 자동으로 등록되지는 않아요. 앱의 새 봇이나 CLI로 추가하면 돼요.

Grok이 PATH에 있다면 예시 grok 봇에게 바로 말을 걸 수 있어요. 없다면 새 봇을 만들면서 설치해 둔 CLI를 고르면 돼요.


데스크톱 사용법

  1. crew를 실행해 창을 열어요.
  2. 사이드바에서 봇을 고르거나, 새 봇 (⌘N)으로 Grok / Claude / Codex 봇을 만들어요.
  3. 여러 봇을 함께 쓰려면 새 채널 (⌘⇧N)을 만들고 멤버를 넣어요.
  4. 메시지, @멘션, 파일 첨부 (⌘U), /스킬을 사용해요.
  5. ⌘I로 봇/채널 정보를 봐요 (역할, 모델, 메모리, 작업 폴더, 아바타).
  6. ⌘⇧R로 루틴을 관리해요.

단축키

입력 중에도 ⌘ 조합은 그대로 동작해요. ?는 입력창 밖에서만 먹혀요.

⌘/ 단축키
⌘, 설정
⌘K 검색
⌘J 입력창
⌘⌥↑ / ⌘⌥↓ 이전 / 다음 대화
⌘⇧↓ 맨 아래
⌘N 새 봇
⌘⇧N 새 채널
⌘I 정보
⌘⇧R 루틴
⌘. 중지
⌘U 파일 첨부
⌘↩ 한 번 허용
⌘⌫ 거부

CLI

CLI도 데스크톱과 같은 데몬, 같은 agents.json을 써요. 데몬이 꺼져 있어도 agent / channel / memory / routine의 설정 변경은 파일에 바로 반영돼요. tell, send, reset, routine run처럼 살아 있는 세션이 필요한 명령은 데몬을 띄운 뒤에 실행해요.

봇 세션 안에서 crew tell을 실행하면 CREW_AGENT_ID가 보낸 사람이 돼요. 에이전트 프로세스가 데몬을 새로 띄우지는 않아요.

crew                    # 데스크톱
crew app
crew daemon             # 백그라운드 서버만
crew stop

crew agent list
crew agent add review --cli claude --name "리뷰어"
crew agent add impl --cli grok --cwd ~/Projects/app
crew agent add hack --cli codex
crew agent set grok --name "그록봇 테스터"
crew agent set grok --model grok-4 --effort high --shape circle --color "#ff6a00"
crew agent clone grok --name "Grok 복사본"
crew agent remove shell

crew tell grok 이 파일의 테스트를 보강해줘
crew tell review --from grok 방금 패치 리뷰해줘
crew tell --channel frontend @grok 오늘 보드 요약해줘
crew ask --question "어느 쪽을 고를래?" --option A --option B --option C
crew ask --question "로그인" --input 아이디 --input 비밀번호

crew channel add frontend --name "프론트엔드" --members grok,review
crew channel add --name "브라우저 QA" --members grok,review   # id를 생략하면 이름에서 만들고, 만든 id를 출력해요
crew channel send frontend 스탠드업 시작
crew channel set frontend --brief "이 방은 UI만"
crew channel join frontend impl
crew channel leave frontend review

crew routine add grok --name "아침" --schedule "평일 8시에 브리핑" --prompt "오늘 할 일 브리핑"
crew routine add grok --name "아침" --schedule "0 8 * * 1-5" --prompt "오늘 할 일 브리핑"
crew routine add '#frontend' --name "스탠드업" --schedule "0 9 * * 1-5" --prompt "어제 한 일"
crew routine run grok 아침

crew memory show grok
crew memory set grok 사용자는 한국어로 짧게 답하길 좋아한다
crew memory append grok 이 레포는 워크스페이스 루트가 crew 다

crew messages grok
crew reset grok
crew reset grok --drop-routines

crew agent add에는 --cli grok|claude|codex 또는 --cmd …가 필요해요. --cmd를 주면 --cli는 무시돼요. 작업 폴더를 생략하면 /tmp/crew-demo/<id>가 돼요.

채널 루틴의 대상은 #채널id 형식으로 적어요.


데이터 위치

기본 경로: ~/Library/Application Support/crew
변경하려면: CREW_HOME

경로 내용
agents.json 봇·채널·루틴
groups.json 사이드바 그룹
locale ko 또는 en (알림·CLI 라벨)
roster.md 봇에게 주입되는 최신 봇 명단
memory/<id>.md 대화를 지워도 남는 기억
skills/<이름>.md /이름 스킬
transcripts/<id>.jsonl 1:1 대화
channels/<id>.jsonl 채널 대화
cli-sessions/<id> Grok/Claude/Codex 세션 id
archive/ 지운 대화
uploads/ 첨부 파일
crew.sock / crew.pid 데몬
crew.log 데몬 로그

개발

git clone https://github.com/im-ian/crew.git
cd crew
cargo run -p crew          # 디버그. UI는 Vite http://127.0.0.1:1420
cargo test -p crew
(cd crates/crew/ui && npm test)

디버그 빌드는 ui/dist가 있으면 프론트엔드를 다시 번들하지 않고 창을 Vite에 연결해요. 릴리스 빌드는 npm run build로 ui/dist를 만들어요.

crates/crew/src/     Rust: CLI, 데몬, 헤드리스/PTY, Tauri 커맨드
crates/crew/ui/src/  React 19 UI

GitHub에 vX.Y.Z 태그를 올리면 Release 워크플로가 Apple Silicon·Intel DMG와 업데이터 latest.json을 게시해요. Cargo.toml, crates/crew/tauri.conf.json, crates/crew/ui/package.json의 버전이 태그와 같아야 해요. 업데이터 서명을 쓰려면 저장소 Secrets에 TAURI_SIGNING_PRIVATE_KEY가 있어야 해요.

핵심은 데몬이에요. 데스크톱 앱과 crew CLI가 Unix 소켓으로 JSON 요청을 보내면, 데몬이 에이전트 프로세스를 실행해요.


라이선스

MIT. Cargo.toml의 workspace.package.license와 동일해요.

About

Local multi-agent daemon + Tauri desktop window

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages