<div align="center">
<img src="https://raw.githubusercontent.com/weixijia/mas-office/HEAD/docs/assets/logo.svg" alt="MAS Office logo" width="96">
MAS Office
사용자가 설계하고, 관찰하며, 조종할 수 있고, 스스로 검증하는 AI 팀.
CI
npm
License: MIT
Protocol v0.2
Zero dependencies
PRs welcome
GitHub stars
웹사이트 · 빠른 시작 · 팀 설계하기 · 팀 실행하기 · 검증 (작동 방식) · 다른 프레임워크 · CLI · 제한 사항 · 로드맵 · 중국어
</div>
팀의 모든 역할은 사용자가 로그인한 컴퓨터에서 실제로 작동하는 Claude Code 또는 Codex 세션입니다. 사용자는 역할을 설계하고 설계를 확정하며, 일반 코드가 작업을 스케줄링하고 각 역할의 도구를 강제합니다. 모든 세션에서 발생하는 도구 승인 요청, 질문, 막힌 역할(stuck roles), 검사기 플래그(checker flags), 단계별 체크포인트는 하나의 "사용자 필요" 받은 편지함에 도착하며, 여기서 사용자가 직접 답변하게 됩니다. 답변은 각 주장(claim)에 출처를 태그하고, 모든 링크를 확인하며, 깨끗한 컨텍스트를 가진 검사기(checker)가 판단한 내용과 함께 돌아옵니다.
첫 번째 사용 사례는 연구 및 의사 결정 작업입니다: 가격 비교, 여행 계획, 문헌 및 실현 가능성 검토, 제품 및 정책 관련 질문 등입니다.
<p align="center">
<img src="https://raw.githubusercontent.com/weixijia/mas-office/HEAD/docs/assets/inbox.png" alt="MAS Office 패널. 왼쪽: 네 개의 책상이 있는 아이소메트릭 사무실; 리테일 파인더가 작동하고, 마켓 파인더에는 '필요한 것' 배지가 있으며, 캐치 체커는 차례를 기다리고 있습니다. 오른쪽: 하나의 승인이 대기 중인 필요함(Needs you) 받은 편지함. 시장 파인더가 'sony xm6 ebay'에 대해 웹 검색을 요청하는 모습과 도구 입력이 표시되며, 캐치 체커와 리드(Lead)를 지연시키고 있다고 말하고, 한 번 허용(Allow), 거부(Deny) 또는 답장하기를 제안합니다." width="900">
<br>
<sub>승인이 대기 중인 "필요함(Needs you)" 받은 편지함. 이 페이지의 스크린샷은 실제 패널, 서버 및 엔진에서 가져온 것이며, "헤드폰 딜(Headphone deals)" 데이터는 가상의 것입니다.</sub>
</p>
상태 (v0.3.0). mas-office up은 실제 Claude Code 및 Codex 세션에서 잠긴 팀을 실행합니다. 오피스 뷰, JS 및 Python SDK를 갖춘 이벤트 프로토콜, 그리고 노코드(no-code) 팀 키트가 이전과 같이 작동합니다. 아직 완료되지 않은 기능: 사용자가 제어할 수 있는 원시 터미널(raw-terminal) 탭, 평가 실행(evaluation runs), 데스크톱 앱입니다. 오늘의 제한 사항을 참조하십시오.
빠른 시작
실제 세션에서 팀 실행하기 (Node ≥ 18.14):
mkdir ~/mas-work && cd ~/mas-work
npm install mas-office mas-office-runtime
claude auth login
...
up은 Claude Code와 Codex가 설치되었고 로그인되었는지 보고한 다음, 접근 토큰이 포함된 패널 링크를 출력합니다(--open을 사용하면 열립니다). 예제 디자인은 이미 잠겨 있으므로, 변경하려면 npx mas-office team lock deals를 다시 실행하십시오. 워크스페이스는 역할(roles)이 읽지 않기를 원하는 CLAUDE.md가 있는 폴더 외부에 유지하십시오: Claude Code는 상위 CLAUDE.md 파일을 로드합니다. 아래에서, mas-office는 해당 폴더의 npx mas-office를 의미합니다 (또는 npm install -g mas-office 이후 명령어 자체를 의미합니다).
시뮬레이션된 팀 관찰하기 (Node ≥ 18, 로그인 불필요):
다섯 명의 에이전트 팀이 리스본 주말 여행을 계획합니다: 두 명의 파인더(finders)가 병렬로 검색하고, 예산 검사기(budget checker)가 문제를 제기하며, 플래너(planner)가 작업을 이어받고, 리드(Lead)가 결과를 작성합니다.
<details>
<summary><code>demo</code> 명령어 (0.2 뷰어로 기록됨)</summary>
<br>
<img src="https://raw.githubusercontent.com/weixijia/mas-office/HEAD/docs/assets/demo.gif" alt="0.2 뷰어로 기록된 데모: 두 명의 파인더 에이전트가 병렬로 검색하고, 예산 검사기가 플래그를 제기하며, 플래너가 작업을 이어받고, 결과가 준비되면 팀원들이 축하합니다." width="900">
</details>
클론(clone) 사용 시 (기여자용): git clone https://github.com/weixijia/mas-office && cd mas-office && npm install는 두 패키지를 연결하며, node packages/node/bin/mas-office.js는 mas-office를 의미합니다. 클로드 코드(Claude Code)가 이 저장소의 CLAUDE.md 파일을 로드할 것이므로, 워크스페이스는 클론 외부에 유지해야 합니다.
팀 설계 및 잠금(lock) 처리
팀은 <project>/mas/structure.json (또는 그 .js 쌍)입니다. 팀 설계 v2는 프로토콜의 structure에 선택적 필드를 추가합니다: 역할별 backend, 각 역할의 도구(tools)에 대한 allow, ask, 또는 deny, 검토자 및 검토 라운드, 게이트(gates), 리드가 부여할 수 있는 승인(approvals), budget, 그리고 검증 임계값(verification thresholds). 0.1 구조도 여전히 유효합니다. examples/price-compare의 일부:
{
"lead": {"id": "lead", "name": "Lead", "backend": "claude-code",
"delegate": [{"effect": "allow", "kind": "approval", "tools": ["web search"]}]}
...
**도구(Tools)**는 고정된 어휘집에서 가져옵니다. 그 외의 모든 것은 잠금 처리 시 거부됩니다:
<table>
<thead>
<tr><th>Word</th><th>역할이 얻는 것</th></tr>
</thead>
<tbody>
<tr><td>`web search`</td><td>웹 검색 및 페이지 가져오기 (web search and page fetches)</td></tr>
</tbody></table>
각 항목은 단어(효과 `allow`)이거나 `{"name": "…", "effect": "allow" | "ask" | "deny"}`입니다. 모든 역할은 프로젝트 폴더를 읽을 수 있습니다 (단, `raw/`는 `read my files`가 없는 경우 제외) 그리고 자신의 파일만 쓸 수 있습니다: `outputs/work/<role>*.md` 및 `sources/`의 소스 카드들입니다. 일부 규칙은 설계가 무엇이라고 하든 지켜집니다: 자격 증명(credentials)은 절대 읽히지 않으며; 지침 및 설정 파일 (`CLAUDE.md`, `AGENTS.md`, `.claude/`, `.mcp.json`, …)은 절대 쓰여지지 않습니다; 로컬 및 개인 주소는 절대 가져와지지 않으며; 프로젝트 폴더 전체에 대한 Grep 또는 재귀 검색은 거부되므로, 역할은 `outputs/` 또는 `sources/`와 같은 더 좁은 폴더를 전달합니다.
위임(Delegation) (lead.delegate): 일치하는 첫 번째 규칙이 승인을 결정합니다. allow는 정책에 따라 승인하고, lead는 나열된 도구 및 역할 내에서 리드(Lead)가 결정하도록 하며, human(또는 일치하는 항목 없음)은 사용자에게 보냅니다. 게이트(Gates), 검사기 플래그(checker flags) 및 사람을 위해 표시된 요청은 항상 사용자에게 옵니다.
확인(Check), 잠금(lock), 보기(show):
mas-office team check <project>
mas-office team lock <project>
mas-office team show <project>
실행은 잠기지 않았거나 잠긴 후에 변경된 설계를 거부합니다. 런타임(run time) 동안 각 역할의 도구는 해당 세션의 옵션으로 컴파일되며, 모든 도구 호출은 하나의 결정 지점(decideTool)을 통과합니다: 허용됨(allowed), 거부됨(denied), 또는 받은 편지함으로 전송됨(sent to the inbox).
팀 실행하기 (Run a team)
mas-office up <workspace> --project <p> --task "…" [--max-parallel 3] [--open] [--exit]
up은 런타임이 연결된 패널 서버를 시작합니다. --task 없이 사용하면, 패널에서 런을 시작합니다. --exit를 사용하면 런이 끝날 때 중지하고, 런이 완료되지 않은 경우 종료 코드 1로 나갑니다. 런은 다음과 같이 진행됩니다:
- 계획 수립 (Plan). 리드(Lead)는 그 자체로 실제 세션이며, 작업과 팀을 읽고 각 역할에 대한 계획 및 개요를 반환합니다. 스케줄러(scheduler)는 일반 코드로 작성되었으며, 리드가 반환하는 모든 것을 검증합니다.
- **단계 (Stages)**는 디자인의 순서대로 실행되며, 단계 내부의 역할들은 병렬로 실행됩니다. 기본적으로 최대 3개의 역할이 동시에 작업할 수 있습니다 (
--max-parallel, 1–12). 이 제한은 프로젝트 전반에 걸친 전체 up 프로세스에 적용되는 것이며, 리드는 계산되지 않습니다. 디자인의 budget.maxParallel을 통해 이를 낮출 수 있습니다.
- 검토 (Review). 검토자는 깨끗한 컨텍스트(clean context)로 대상자의 작업을 읽고 이를 수락하거나, 메모와 함께 되돌리거나, 에스컬레이션(escalate)합니다.
review.maxRounds 이후 또는 에스컬레이션 발생 시 사용자가 결정합니다. 아무것도 조용히 수락되지 않습니다.
- 체크포인트 (Checkpoints). 차단 게이트(blocking gate)는 디자인이 배치한 지점에서 사용자가 계속 진행하거나(continue), 메모와 함께 단계를 되돌리거나(send the stage back with a note), 실행을 중지할 때까지 프로세스를 보류합니다.
- 작성 (Write-up). 리드는 모든 주장(claim)에 태그를 달아
outputs/result.md에 답변을 작성합니다. 이후 이 주장은 검사됩니다 (아래 참조).
- 후속 조치 (Follow-ups). 패널에서 결과에 대해 질문합니다. 리드는 파일에서 답변하거나 질문이 필요한 역할만 되돌려 보내며, 이 답변은 새로운 라운드가 됩니다.
<p align="center">
<img src="https://raw.githubusercontent.com/weixijia/mas-office/HEAD/docs/assets/gate.png" alt="A stage checkpoint in the inbox: the Lead asks you to look at the offers before checking, lists the two finders' work files, says the next stage does not start until you answer and that it holds up the Catch checker, and offers Looks good, continue, Stop the run, or send it back with a note." width="900">
<br>
<sub>단계 체크포인트: 검사 단계는 사용자가 계속 진행하거나(continue), 메모와 함께 단계를 되돌리거나(send the stage back with a note), 중지할 때까지 기다립니다.</sub>
</p>
받은 편지함(The inbox). 모든 세션에서 사람에게 필요한 모든 것들이 모여 있습니다: 도구 승인, 질문, 결정 사항(막힌 역할, 실행 지속 여부), 검사기 플래그 및 게이트. 각 항목은 얼마나 오래 기다렸는지, 무엇이 지연되고 있는지, 그리고 답변하지 않을 경우 무슨 일이 발생하는지 보여줍니다. 오피스에서는 책상 위의 손들처럼 동일한 항목들을 보여줍니다. 위임된 승인은 정책이나 리드(Lead)에 의해 결정되지만, 여전히 당신에게 전달될 수 있으며; 이러한 모든 결정은 누가 했는지와 함께 로그에 기록됩니다.
- 한 번 허용(Allow once), 항상 허용(always allow), 거부(deny). "항상 허용"은 해당 에이전트의 해당 실행에서 그 호출(동일한 도구, 동일한 입력)을 정확하게 기억합니다.
- 키보드.
N은 당신이 필요한 다음 에이전트로 이동하고, I는 받은 편지함으로 이동하며, A / D는 포커스된 요청을 허용하거나 거부합니다. 1–9는 스테이지를 열고, ?는 키 목록을 보여줍니다.
에이전트 조종(Steering an agent). 책상을 클릭하여 서랍을 열면: 실시간 기록(live transcript), 출력물, 그리고 실제 세션으로 연결되는 채팅 상자를 볼 수 있습니다. 메시지는 조종할 수 있거나(다음 휴식 시간에 전달됨), 큐에 넣거나(현재 턴 이후) 또는 가로챌 수 있습니다. 영수증은 해당 세션이 그 메시지를 어떻게 처리했는지 보여줍니다. *중지(Stop)*는 에이전트의 턴을 끝냅니다.
<p align="center">
<img src="https://raw.githubusercontent.com/weixijia/mas-office/HEAD/docs/assets/agent-drawer.png" alt="Retail finder를 위한 에이전트 서랍 (Claude Code 실행): 현재 무엇을 하고 있는지, 그 이유, 그리고 다음에 올 것; 리드의 요약 및 WebSearch 호출이 포함된 기록(Transcript) 탭; '무료 배송 매장 선호'라는 조종 메시지와 '적용됨, 다음 휴식 시간에 전달됨'이라는 영수증; 조종(Steer), 큐(Queue), 가로채기(Interrupt) 버튼, 중지(Stop) 및 전송(Send)." width="900">
<br>
<sub>에이전트 서랍: 기록, 출력물, 그리고 배달 영수증과 함께 실제 세션으로 연결되는 채팅 상자.</sub>
</p>
정지 및 재시작(Stalls and restarts). budget.stallMinutes에 대한 진행이 없는 역할은 한 번 '넛지(nudge)'되며, 다음으로 리드(Lead)가 복구 방안(재시도(retry), 새로운 브리프(brief), 또는 사용자에게 질문하기)을 선택합니다. 그 이후는 사용자가 결정합니다. 사람을 기다리는 것은 정지가 아닙니다. 실행은 budget.maxRunMinutes (기본값 90)에 도달하거나, 중지(Stop)되거나, Ctrl+C를 눌러 중단되면 멈춥니다. 만약 진행 중인 실행이 있는 상태에서 'up'을 재시작하면, 인박스(inbox)는 계속할지 여부를 묻습니다. 완료된 역할은 다시 실행되지 않으며, 해당 실행의 시간 예산은 계속 카운트됩니다. 오래전에 열어둔 프로세스가 만료되면 에이전트가 다시 질문합니다.
응답 가능 주체(Who may answer). up과 serve에 의해 인쇄된 패널 링크에는 토큰이 포함되어 있습니다. 해당 링크로 연 브라우저를 통해서만 요청에 응답하거나, 에이전트에게 메시지를 보내거나, 실행을 시작할 수 있으며, 다른 곳(file://, 웹사이트, 정적 서버)에서는 패널이 읽기 전용(read-only)입니다. up이 실행되는 동안에는, 결정, 평결, 결과 및 런타임이 소유하는 기타 이벤트는 오직 런타임이나 토큰을 가진 패널에 의해서만 게시될 수 있으므로, 역할의 셸 명령어로는 자체 작업을 보증할 수 없습니다.
사용자가 직접 연 세션(Sessions you opened yourself). mas-office hook claude-code가 설치된 경우, 사용자의 Claude Code 세션의 권한 프롬프트도 인박스에 나타납니다. 사용자는 터미널에서 이에 응답하며, 패널은 해당 세션을 관찰할 뿐입니다.
답변 확인 방법(How answers are checked)