이미 쓰고 있는 Grok / Claude Code / Codex CLI를 하나의 창 안에 봇으로 모아 주는 맥 앱이에요. 모델 API를 새로 붙이는 대신, CLI를 헤드리스로 실행하고 그 답변만 말풍선으로 보여줘요.
설치 스크립트나 GitHub Releases의 .dmg로 설치할 수 있고, 설치된 앱은 새 버전이 나오면 직접 업데이트해요.
에이전트 세션 하나를 사람 하나로 봐요. 리뷰는 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" bashReleases에서 Crew_*_aarch64.dmg(Apple Silicon) 또는 Crew_*_x64.dmg(Intel)를 받아 Applications로 복사한 뒤 quarantine 속성 제거:
xattr -dr com.apple.quarantine /Applications/Crew.appCrew는 Apple Developer ID로 서명·공증되지 않은 ad-hoc 빌드입니다. 위 명령은 Gatekeeper의 quarantine 플래그만 떼는 단계로 앱 무결성에는 영향이 없습니다.
설치된 앱은 시작 시와 설정에서 업데이트를 확인해요. 새 버전은 사용자가 설치를 고른 뒤에만 받아 다시 실행합니다.
미리 빌드된 앱 대신 저장소를 받아서 직접 빌드할 수도 있어요. 요구사항은 Rust stable (rustup, rustc 1.95에서 확인), Node.js 20+, Xcode Command Line Tools예요.
# Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# Xcode Command Line Tools (아직 없다면)
xcode-select --installNode는 nodejs.org에서 받거나 brew install node로 설치하면 돼요.
각 도구의 공식 설치 방법을 따른 뒤, 터미널에서 해당 명령이 실행되는지만 확인하면 돼요.
grok --version
claude --version
codex --version저장소에서 빌드
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.shPATH에 넣으려면:
install -m 755 target/release/crew "$HOME/.local/bin/crew"
# 또는
cargo install --path crates/crew --lockedcargo 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 의존성 때문에 시간이 좀 더 걸려요.
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를 고르면 돼요.
crew를 실행해 창을 열어요.- 사이드바에서 봇을 고르거나, 새 봇 (
⌘N)으로 Grok / Claude / Codex 봇을 만들어요. - 여러 봇을 함께 쓰려면 새 채널 (
⌘⇧N)을 만들고 멤버를 넣어요. - 메시지,
@멘션, 파일 첨부 (⌘U),/스킬을 사용해요. ⌘I로 봇/채널 정보를 봐요 (역할, 모델, 메모리, 작업 폴더, 아바타).⌘⇧R로 루틴을 관리해요.
입력 중에도 ⌘ 조합은 그대로 동작해요. ?는 입력창 밖에서만 먹혀요.
⌘/ |
단축키 |
⌘, |
설정 |
⌘K |
검색 |
⌘J |
입력창 |
⌘⌥↑ / ⌘⌥↓ |
이전 / 다음 대화 |
⌘⇧↓ |
맨 아래 |
⌘N |
새 봇 |
⌘⇧N |
새 채널 |
⌘I |
정보 |
⌘⇧R |
루틴 |
⌘. |
중지 |
⌘U |
파일 첨부 |
⌘↩ |
한 번 허용 |
⌘⌫ |
거부 |
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-routinescrew 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와 동일해요.



