이미 쓰고 있는 Grok / Claude Code / Codex / Antigravity / Gemini / Copilot / OpenCode 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 |
| Antigravity | agy --dangerously-skip-permissions |
| Gemini | gemini --approval-mode yolo |
| Copilot | copilot --allow-all --no-ask-user |
| OpenCode | opencode run --auto |
Grok / Claude / Codex는 턴 단위 헤드리스로 실행돼요. -p / exec의 스트리밍 JSON만 읽기 때문에 배너나 스피너, 단축키 안내가 말풍선에 섞이지 않아요. CLI 세션 id는 봇별로 보관하니까 대화를 이어서 할 수 있고, 대화를 지우면 새 세션이 열려요.
Antigravity / Gemini / Copilot / OpenCode도 턴 단위로 실행하지만 세션 id는 두지 않아요. 대신 매 턴 지금까지의 대화를 프롬프트에 같이 보내요.
목록에 없는 명령도 봇으로 쓸 수 있어요. --headless로 만들면 메시지마다 그 명령을 실행하고, 메시지는 마지막 인자로 붙어요. --headless가 없으면 cat 같은 스텁처럼 긴 PTY 세션, 즉 터미널로 남아요. 테스트나 간단한 에코 봇에 쓰면 돼요.
세션마다 CREW_AGENT_ID와 확장된 PATH가 들어가요. 시스템 프롬프트는 대략 이렇게 알려 줘요.
사용자가
@id를 쓰면 그건 너에게 다른 봇을 가리키는 것이다. 이 세션에 남아라. 필요하면 직접crew tell <id> <text>를 실행해라. 이름을 바꿔 달라면crew agent set --name "새 이름"을 실행해라. 봇을 만들라면crew agent add를, 사이드바 그룹을 만들라면crew group add를 실행해라. 반복 일을 맡기면 그 말을 cron으로 바꿔crew routine add로 루틴을 만들고, 고치거나 지우라면crew routine edit/remove를 실행해라. 사람에게 고르라고 물으려면crew ask --question "..." --option A --option B를 실행해라. 값을 적으라고 하려면--input 아이디를 보태라. 다른 봇에게 묻지 마라. 나중 대화에 필요한 걸 알게 되면crew memory append로 적어라. 고치거나 잊으라면crew memory show로 보고crew memory set으로 다시 써라. 비밀은 적지 마라. 팀 전체 메모와 지금 봇 목록은 공유 메모리에 있다.crew share show로 보고, 팀 메모는crew share append로 더하고crew share set으로 노트만 다시 쓴다. 봇 목록은 Crew가 매번 다시 쓴다.
그래서 1:1 대화에서 @리뷰어 이 패치 봐줘라고 쓰면, 지금 대화 중인 봇이 먼저 일을 하고 필요할 때 리뷰어 봇에게 넘겨요. 멘션은 @id로 저장되고 화면에는 봇 이름으로 보여요. 입력창에 이름을 적어도 보낼 때 id로 바뀌고, 봇도 답에 동료를 @id로 적어요. 이름을 여러 개 적으면 지금 봇이 답을 끝낸 뒤에, 적힌 순서대로 한 명씩 답해요. 봇 사이의 릴레이는 사용자 메시지 하나당 최대 4홉이에요. 이름 변경, 봇·그룹 만들기, 루틴 등록은 채팅에서 시키면 봇이 같은 식으로 crew를 실행해요. 사람에게 A / B / C를 고르라고 묻거나 값을 적으라고 할 때도 crew ask로 그 봇의 채팅에 카드가 떠요.
대화 기록은 지우면 아카이브로 옮겨가지만, $CREW_HOME/memory/<id>.md는 그대로 남아요. 메모리 탭에서 직접 적을 수도 있고, 봇이 대화하다 오래 남길 만한 걸 알게 되면 스스로 crew memory append로 적어요. 고치거나 잊을 땐 crew memory set으로 통째로 다시 쓰고, 비밀번호나 토큰은 적지 않아요.
새 세션을 열 때 Grok은 --rules로, Claude는 --append-system-prompt로, Codex는 -c developer_instructions=로 그 봇의 메모리를 넣어 줘요. 이런 플래그가 없는 다른 CLI는 매 턴 프롬프트 앞에 넣어요. Claude와 Codex는 이어지는 턴에 처음 시스템 프롬프트를 그대로 쓰고, Grok은 시스템 프롬프트가 바뀌면 프롬프트 캐시를 잃어요. 그래서 세션 도중에 그 봇의 메모리가 바뀌면 시스템 프롬프트는 그대로 두고, 다음 턴 앞에 [crew system] 메모로 새 내용을 한 번 알려 줘요. 봇을 복제하면 그 메모리도 함께 복사되고, 봇을 삭제하면 그 파일도 같이 지워져요.
공유 메모리는 $CREW_HOME/shared.md 하나예요. 모든 봇이 같은 노트를 보고, 메모리 탭에서도 고칠 수 있어요. 봇 목록은 이 파일에 적히지 않아요. 매 턴 프롬프트의 Shared memory 노트가 지금 명단과 공유 노트를 같이 넣어요. 대화가 압축돼도 다음 턴에 다시 붙어요. crew share set은 노트만 바꾸고, 명단은 Crew가 그 턴의 봇 목록으로 다시 만들어요.
채팅
- 봇 사이드바, 사이드바 그룹, 드래그 앤 드롭, 검색 (
⌘K). 목록은 그 채팅의 마지막 말을 보여 주고, 사이드 채팅으로 접힌 답은 빼요 - 스트리밍 말풍선, 연속 답변 분리, 로컬 이미지·파일 경로
- 봇이 쓴 마크다운은 렌더링해서 보여 줘요. 표도 표로 나와요
- 말풍선마다 옆에 복사·답장 버튼이 있어요
@멘션칩, 파일 첨부,/스킬문구 삽입- 첨부한 이미지는 말풍선 위, 보낸 쪽에 붙어요
- 대기열로 두면, 봇이 작업 중일 때 보낸 메시지는 순서대로 대기해요. 봇당 최대 32개. 대기 중인 메시지는 그 자리에서 수정하거나 취소할 수 있고, 바로전송으로 그 한 줄만 보낼 수 있어요. 봇이 이미 작업 중이면 지금 턴은 멈추지 않고, 그 줄이 턴 다음에 혼자 나가요. 입력창이 비어 있으면
↑/↓로 대기 중인 줄을 고르고 Enter로 수정해요. Enter는 보내지 않아요 - 봇이 작업 중일 때
⌘⇧↩로 보내면 지금 턴을 멈추고 그 메시지부터 시작해요 - 설정의 메시지 전달은 기본이 인터럽트예요. 작업 중일 때 보낸 메시지가 지금 턴을 멈추고 그 메시지부터 시작해요. 대기열로 바꾸면 순서대로 기다려요
- 중지 (
⌘.또는stop/중지/멈춰). CLI가 한 줄도 쓰기 전에 멈추면 그 턴에 묶인 메시지는 대기열 앞으로 돌아가고, 다음 메시지나 바로전송을 기다려요. 시작 후 첫 출력이 없을 때도(grok 15초, claude·codex 30초) 같이 돌아가고, 채팅에CLI가 응답하지 않습니다가 남아요. 이어가던 세션이 그래서 멈추면 그 세션을 버리고,CLI가 이전 세션에서 응답하지 않아 새 세션으로 다시 보냅니다라고 남긴 뒤 새 세션에서 한 번 더 보내요. 새 세션도 답이 없으면CLI가 응답하지 않습니다와 함께 대기열에 둬요. 확인이 필요할 땐 한 번 허용 / 거부 - 봇이 사람에게 고르거나 값을 적으라고 물으면 (
crew ask) 그 채팅에 카드가 떠요. 고른 답이나 적은 값이 봇에게 돌아와요. 다른 봇에게 묻지 않아요 - 도구 호출은 설정에서 켜면 접힌 카드로 보여 주고, 봇과 주고받은 메시지는 한 줄로 접혀요
- Claude나 Grok 봇이 서브 에이전트에게 일을 맡기면, 건넨 지시와 받은 보고도 한 줄로 접혀요. 누르면 부모 봇 옆에 사이드 채팅으로 열려요. 백그라운드로 돌린 서브 에이전트의 말도 그 사이드 채팅에 남아요
- 읽지 않은 대화 표시, Dock 배지, 작업 완료·차단·루틴 실패 알림
봇
- Grok / Claude / Codex / Antigravity / Gemini / Copilot / OpenCode 중에서 선택하거나, 직접 명령을 적어요. AI·모델·생각(effort)은 한 줄에서 고르고, 작업 폴더도 설정. 만들어지면 봇이 자기 일을 물어요
- AI는 나중에 봇 정보에서 바꿔도 돼요. 새 AI가 지금까지의 대화를 한 번 읽고 이어가요
- Grok Bot 스타일의 도형 아바타 (원, 물방울, 둥근 사각형, 육각형, 삼각형, 구름, 알약, 다이아몬드, 오각형, 별, 하트) + 색상. 사진으로 바꿀 수도 있어요
- 작업 중에는 궤도 애니메이션, 확인을 기다릴 땐 회전 링
- 복제, 대화 지우기 (루틴도 함께 지울지 선택), 삭제
루틴
- 채팅에서 봇에게 부탁하면 봇이
crew routine으로 추가·수정·삭제해요. 일정은 5필드 cron이에요 - 루틴 패널은 목록만 보여 줘요. 켜기/끄기 스위치, 우클릭으로 지금 실행·삭제
- 패널에서 스위치를 바꾸면 그 봇의 채팅에 남고, 봇이 알았다고 답해요. 채팅에 남은 그 안내를 누르면 루틴 패널이 열려요
- 실패한 실행도 그 분(minute)의 슬롯을 쓴 것으로 쳐요. 같은 분에 다시 실행되지 않도록요
스킬
- 설정에서 이름과 본문을 마크다운으로 저장 (
$CREW_HOME/skills/<이름>.md) - 입력창에
/이름을 치면 본문이 들어가요
앱
- 한국어 / English
- 다크 / 라이트 / 시스템 (맥 외관 설정)
- 단축키 오버레이 (
⌘/, 또는 입력창 밖에서?) - macOS 자동 업데이트 — 새 버전을 알려 주고, 적용 시점은 설정에서 고를 수 있어요
| 항목 | 내용 |
|---|---|
| OS | macOS (Unix 소켓, ~/Library/Application Support, 트래픽 라이트 타이틀바) |
| 에이전트 CLI | grok, claude, codex, agy, gemini, copilot, opencode 중 쓸 것만. 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예요. 스크립트는 없는 것을 채운 뒤 릴리스 바이너리를 ~/.local/bin/crew에 넣어요.
git clone https://github.com/im-ian/crew.git
cd crew
./scripts/setup-macos.sh이미 켜 둔 셸에서 실행하면 그 PATH의 Rust와 Node를 써요. Rust가 없으면 rustup으로, Node가 없고 Homebrew가 있으면 brew install node로 설치해요. Xcode Command Line Tools가 없으면 설치 창을 띄우고 끝나니, 설치가 끝난 뒤 같은 명령을 다시 실행해요. 바이너리 위치는 CREW_BIN_DIR로 바꿀 수 있어요. 릴리스 설치 스크립트가 만들어 둔 ~/.local/bin/crew 링크가 있으면, 그 링크는 소스 빌드 바이너리로 바뀌어요.
~/.local/bin이 PATH에 없으면 셸 설정에 추가한 뒤 crew로 실행해요. 인자 없이 실행하거나 crew app을 쓰면 데스크톱 창이 열려요. 데몬이 떠 있지 않으면 같은 바이너리가 백그라운드 데몬을 함께 띄워요. 창만 닫으면 데몬은 남아 있을 수 있어요. 완전히 종료하려면 crew stop. 창은 한 번에 하나예요.
build.rs가 crates/crew/ui에서 npm install과 npm run build를 실행해요. 첫 빌드는 Node 의존성 때문에 시간이 좀 더 걸려요.
macOS .app / .dmg는 ./scripts/build-macos.sh로 만들어요. 서명 키가 없으면 업데이터 아티팩트 없이 호스트 아키텍처 번들만 나와요. 체크아웃 없이 바이너리만 받으려면:
cargo install --git https://github.com/im-ian/crew.git --locked crewcargo install은 ~/.cargo/bin/crew에 설치해요. rustup으로 설치했다면 이미 PATH에 잡혀 있어요.
에이전트 CLI는 쓸 것만 각 도구의 공식 방법으로 설치하면 돼요. Crew는 모델을 내장하지 않아요.
grok --version
claude --version
codex --version데이터 홈은 기본적으로 여기예요.
~/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)으로 봇을 만들어요. 만들어진 봇이 먼저 어떤 일을 맡을지 물어요. - 메시지,
@멘션, 파일 첨부 (⌘U),/스킬을 사용해요. - 헤더의 정보 버튼이나
⌘I로 봇 정보를 봐요 (모델, 메모리, 작업 폴더, 아바타). ⌘⇧R로 루틴 목록을 봐요. 추가와 수정은 채팅에서 봇에게 부탁해요.
입력 중에도 ⌘ 조합은 그대로 동작해요. ?는 입력창 밖에서만 먹혀요.
⌘/ |
단축키 |
⌘, |
설정 |
⌘K |
검색 |
⌘J |
입력창 |
⌘⌥↑ / ⌘⌥↓ |
이전 / 다음 대화 |
⌘⇧↓ |
맨 아래 |
⌘N |
새 봇 |
⌘I |
정보 |
⌘⇧R |
루틴 |
⌘. |
중지 |
⌘⇧↩ |
바로 보내기 |
⌘U |
파일 첨부 |
⌘↩ |
한 번 허용 |
⌘⌫ |
거부 |
CLI도 데스크톱과 같은 데몬, 같은 agents.json을 써요. 데몬이 꺼져 있어도 agent / memory / routine의 설정 변경은 파일에 바로 반영돼요. group은 데몬을 거치지 않고 groups.json에 바로 써요. 켜져 있는 창은 새 그룹을 다음 목록 갱신에서 가져와요. tell, send, reset, routine run처럼 살아 있는 세션이 필요한 명령은 데몬을 띄운 뒤에 실행해요.
봇 세션 안에서 crew tell을 실행하면 CREW_AGENT_ID가 보낸 사람이 돼요. routine은 봇 id를 생략하면 그 봇의 루틴을 가리켜요 (crew routine edit 아침 …). 루틴을 바꾸면 그 봇의 루틴이 다음 실행 시각과 함께 출력돼요. 에이전트 프로세스가 데몬을 새로 띄우지는 않아요.
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 agent add --cli grok --name "리뷰어"
crew agent add --cli agy --name "안티그래비티"
crew agent add --headless --name "내 봇" --cmd my-ai --print
crew group list
crew group add --name "작업"
crew group add --name "리뷰" --bot review --bot impl
crew tell grok 이 파일의 테스트를 보강해줘
crew tell review --from grok 방금 패치 리뷰해줘
crew ask --question "어느 쪽을 고를래?" --option A --option B --option C
crew ask --question "로그인" --input 아이디 --input 비밀번호
crew routine add grok --name "아침" --schedule "0 8 * * 1-5" --prompt "오늘 할 일 브리핑"
crew routine add grok --name "아침" --schedule "평일 8시에 브리핑" --prompt "오늘 할 일 브리핑"
crew routine list grok
crew routine edit grok 아침 --schedule "0 9 * * 1-5"
crew routine pause grok 아침
crew routine remove grok 아침
crew routine run grok 아침
crew memory show grok
crew memory set grok 사용자는 한국어로 짧게 답하길 좋아한다
crew memory append grok 이 레포는 워크스페이스 루트가 crew 다
crew share show
crew share append 배포는 develop에서 확인한다
crew share set 팀 규칙만 남긴다
crew messages grok
crew reset grok
crew reset grok --drop-routinescrew agent add에는 --cli grok|claude|codex|agy|gemini|copilot|opencode 또는 --cmd …가 필요해요. --cmd를 주면 --cli는 무시돼요. --cmd는 꼭 맨 끝에 두세요. 그 뒤에 오는 건 --name 같은 플래그까지 모두 명령의 인자로 들어가요. 모르는 명령을 대화로 쓰려면 --headless를 같이 주세요. 메시지는 그 명령의 마지막 인자로 붙어요. --headless가 없으면 모르는 명령은 터미널로 남아요. id를 생략하고 --name을 주면 id를 만들어서 ok <id>로 출력해요. id를 직접 주면 그 id를 그대로 써요. 작업 폴더를 생략하면 /tmp/crew-demo/<id>가 돼요.
crew group add --name은 사이드바 그룹을 만들어요. --bot <id>를 반복하면 그 봇을 다른 그룹에서 빼 새 그룹에 넣어요. 없는 봇 id는 거절해요. crew group list는 id, 이름, 봇 id를 탭으로 나눠 출력해요.
기본 경로: ~/Library/Application Support/crew
변경하려면: CREW_HOME
| 경로 | 내용 |
|---|---|
agents.json |
봇·루틴 |
groups.json |
사이드바 그룹 |
locale |
ko 또는 en (알림·CLI 라벨) |
roster.md |
저장된 봇 명단 사본 |
shared.md |
공유 메모리 노트. 봇 목록은 매 턴 이 메모와 함께 최신으로 전달 |
memory/<id>.md |
대화를 지워도 남는 그 봇의 기억 |
skills/<이름>.md |
/이름 스킬 |
transcripts/<id>.jsonl |
1:1 대화 |
cli-sessions/<id> |
Grok/Claude/Codex 세션 id |
cli-memory/<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와 동일해요.



