์๋ฆฌ์ฆ: oh-my-codex ์ํคํ ์ฒ ํด๋ถ
์ด ์๋ฆฌ์ฆ๋ OpenAI Codex CLI ํ์ฅ ๋ฐํ์์ธ oh-my-codex(OMX)์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋จ๊ณ๋ณ๋ก ํด๋ถํ๋ ๊ณผ์ ์ด๋ค.
| ํธ | ๋ด์ฉ | ํต์ฌ |
|---|---|---|
| 0ํธ | Overview | 3-Plane ์ํคํ ์ฒ, OMC์์ ์ฐจ์ด, ์ ์ฒด ํ๋ฆ |
| 1ํธ | Codex CLI Foundation | Codex CLI ์์ฒด์ ๊ตฌ์กฐ์ ํ์ฅ ํฌ์ธํธ |
| 2ํธ | OMX Integration | OMX๊ฐ Codex์ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋ |
| 3ํธ | Skill System | ์ํฌํ๋ก์ฐ๋ฅผ ์ด๋ป๊ฒ ์ ์ํ๋ |
| 4ํธ | Prompt & Agent System | ์์ด์ ํธ๋ ๋ญ๊ณ ์ด๋ป๊ฒ ์ ํ๋๋ |
| 5ํธ | MCP Servers | ์ด๋ค MCP ๋๊ตฌ๋ฅผ ์ธ ์ ์๋ |
| 6ํธ | State & Lifecycle | ์ํ๋ฅผ ์ด๋ป๊ฒ ์ ์งํ๋ |
| 7ํธ (๋ณธ๋ฌธ) | Team Orchestration | Team ๋ชจ๋๋ ์ด๋ป๊ฒ ๋์ํ๋ |
| 8ํธ | Native & Spark | Rust ๋ค์ดํฐ๋ธ ๋๊ตฌ๋ ๋ญ๊ฐ |
- Team Orchestration์ N๊ฐ์ ๋ ๋ฆฝ Codex CLI ํ๋ก์ธ์ค๋ฅผ tmux pane์ ์คํฐํ์ฌ ๊ณต์ task list ๊ธฐ๋ฐ์ผ๋ก ๋ณ๋ ฌ ์์ ์ ์ํํ๋ ๋ฉํฐ ์์ปค ์ค์ผ์คํธ๋ ์ด์ ์์คํ
orchestrator.ts๊ฐ 5-Phase ํ์ดํ๋ผ์ธ(plan โ prd โ exec โ verify โ fix)์ ์ ์ดํ๊ณ ,runtime.ts(3,375์ค)๊ฐ ์์ปค ์์ฑยท๋ชจ๋ํฐ๋งยท์ ง๋ค์ด์ ์ ์ฒด ๋ผ์ดํ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ OMX์ ์ต์์ ๋ณ๋ ฌ ์คํ ์์ง- ํ์ผ ๊ธฐ๋ฐ ํต์ (inbox/mailbox)๊ณผ MCP ์ํ ๊ณต์ ๋ก ์์ปค ๊ฐ ์กฐ์จ์ ์ํํ๋ฉฐ, Git worktree๋ก ๊ฐ ์์ปค์ ์ฝ๋ ๋ณ๊ฒฝ์ ๊ฒฉ๋ฆฌํ๋ ํ๋ก์ธ์ค ์์ค ๊ฒฉ๋ฆฌ ์ํคํ ์ฒ
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- 6ํธ์์ ๋ชจ๋ ์ํ ๊ด๋ฆฌ์ ๋ฐฐํ์ /ํฉ์ฑ ๊ท์น์ ๋ค๋ค์ง๋ง, **โteam ๋ชจ๋๊ฐ ํฉ์ฑ(composable)์ธ ์ด์ ์ ๋ด๋ถ ๋์โ**์ด ๋น ์ ธ ์์
- 3ํธ์ ultrawork(ํ๋ก์ธ์ค ๋ด ๋ณ๋ ฌ)๊ณผ ๋ฌ๋ฆฌ, team์ ์์ ๊ฒฉ๋ฆฌ๋ N๊ฐ ํ๋ก์ธ์ค๋ก ๋ณ๋ ฌ ์์ ์ ์ํ โ ์ ์ด ๊ตฌ๋ถ์ด ํ์ํ์ง, ์ด๋ป๊ฒ ์กฐ์จํ๋์ง๋ฅผ ๋ค๋ฃธ
- Ralph + Team ์ฐ๊ณ ํจํด(
omx team ralph ...)์ OMX์ ๊ฐ์ฅ ๊ณ ๋ํ๋ ์ํฌํ๋ก์ฐ โ ๊ฒ์ฆ ๋ฃจํ์ ๋ณ๋ ฌ ์คํ์ ๊ฒฐํฉ
AS-IS (๋จ์ผ ํ๋ก์ธ์ค ์์ โ Ultrawork)
sequenceDiagram autonumber participant U as User participant CX as Codex CLI (๋จ์ผ ํ๋ก์ธ์ค) participant W1 as Worker 1 (์ธํ๋ก์ธ์ค) participant W2 as Worker 2 (์ธํ๋ก์ธ์ค) U->>CX: "$ultrawork refactor API" CX->>W1: ์์ (๊ฐ์ ํ๋ก์ธ์ค ๋ด) CX->>W2: ์์ (๊ฐ์ ํ๋ก์ธ์ค ๋ด) W1-->>CX: ๊ฒฐ๊ณผ ๋ฐํ W2-->>CX: ๊ฒฐ๊ณผ ๋ฐํ CX-->>U: ์ต์ข ๊ฒฐ๊ณผ Note over CX,W2: ๊ณต์ ์ปจํ ์คํธ โ Worker ํฌ๋์ ์ ์ ์ฒด ์ํฅ
TO-BE (ํ๋ก์ธ์ค ๊ฒฉ๋ฆฌ โ Team)
sequenceDiagram autonumber participant U as User participant RT as TeamRuntime (Leader) participant T as tmux session participant W1 as Worker 1 (๋ ๋ฆฝ Codex CLI) participant W2 as Worker 2 (๋ ๋ฆฝ Codex CLI) participant ST as .omx/state/team/ U->>RT: "omx team 2:executor refactor API" RT->>T: tmux session ์์ฑ RT->>ST: config.json, manifest ๊ธฐ๋ก T->>W1: pane 0 โ codex CLI ์คํฐ T->>W2: pane 1 โ codex CLI ์คํฐ W1->>ST: worker/w1/status.json ์ ๋ฐ์ดํธ W2->>ST: worker/w2/status.json ์ ๋ฐ์ดํธ RT->>ST: ์งํ ์ํ ๋ชจ๋ํฐ๋ง W1-->>ST: task ์๋ฃ ๊ธฐ๋ก W2-->>ST: task ์๋ฃ ๊ธฐ๋ก RT->>RT: team-verify ํ์ด์ฆ RT-->>U: ์๋ฃ ๋ณด๊ณ Note over W1,W2: ์์ ๊ฒฉ๋ฆฌ โ Worker ํฌ๋์๊ฐ ๋ค๋ฅธ Worker์ ์ํฅ ์์
Team Pipeline 5-Phase (์์ค: src/team/orchestrator.ts)
Phase ์ ์
export type TeamPhase =
| 'team-plan' // ์์
๋ถํด + ์๋ธํ์คํฌ ์์ฑ
| 'team-prd' // PRD + test-spec ์ฐ์ถ๋ฌผ ์์ฑ
| 'team-exec' // Worker ๋ณ๋ ฌ ์คํ
| 'team-verify' // ๊ฒฐ๊ณผ ๊ฒ์ฆ
| 'team-fix'; // ๊ฒ์ฆ ์คํจ ์ ์์ ๋ฃจํํฐ๋ฏธ๋ ์ํ: complete, failed, cancelled
Phase ์ ์ด ๊ท์น
stateDiagram-v2 [*] --> team_plan: omx team ์์ team_plan --> team_prd: ํ์คํฌ ๋ถํด ์๋ฃ team_prd --> team_exec: PRD + test-spec ์์ฑ ์๋ฃ team_exec --> team_verify: ๋ชจ๋ Worker ์์ ์๋ฃ team_verify --> complete: ๊ฒ์ฆ ํต๊ณผ team_verify --> team_fix: ๊ฒ์ฆ ์คํจ team_fix --> team_verify: ์์ ์๋ฃ, ์ฌ๊ฒ์ฆ team_plan --> failed: ์๋ฌ team_prd --> failed: ์๋ฌ team_exec --> failed: ์๋ฌ team_verify --> failed: ์๋ฌ team_fix --> failed: ์๋ฌ team_plan --> cancelled: ์ฌ์ฉ์ ์ทจ์ team_exec --> cancelled: ์ฌ์ฉ์ ์ทจ์ complete --> [*] failed --> [*] cancelled --> [*]
Phase๋ณ ์์ด์ ํธ ๋งคํ
orchestrator.ts์์ ๊ฐ phase์ ์ ํฉํ ์์ด์ ํธ๋ฅผ ๋ผ์ฐํ
ํ๋ค:
| Phase | ์์ด์ ํธ | ์ญํ |
|---|---|---|
team-plan | architect | ํ์คํฌ ๋ถํด, ์๋ธํ์คํฌ ์ ์ |
team-prd | architect | PRD, test-spec ๋ฌธ์ ์์ฑ |
team-exec | executor (๊ธฐ๋ณธ) | ์ค์ ์ฝ๋ ์์ ์ํ |
team-verify | tester / verifier | ๊ฒฐ๊ณผ๋ฌผ ๊ฒ์ฆ, ํ ์คํธ ์คํ |
team-fix | executor | ๊ฒ์ฆ ์คํจ ํญ๋ชฉ ์์ |
Worker ๋ผ์ดํ์ฌ์ดํด (์์ค: src/team/runtime.ts)
runtime.ts โ 3,375์ค์ ํต์ฌ ์์ง
runtime.ts๋ Team ๋ชจ๋์ ๋ฉ์ธ ์ค์ผ์คํธ๋ ์ด์
๋ฃจํ๋ฅผ ๊ตฌํํ๋ค. ํต์ฌ ํจ์ 3๊ฐ:
| ํจ์ | ์ญํ |
|---|---|
startTeam() | tmux session ์์ฑ, Worker ์คํฐ, task ๋ถ๋ฐฐ ์์ |
monitorTeam() | ์ฃผ๊ธฐ์ ์ผ๋ก Worker ์ํ ํ์ธ, ์๋ฃ/์คํจ ๊ฐ์ง |
shutdownTeam() | ๋ชจ๋ Worker ์ข ๋ฃ, tmux session ์ ๋ฆฌ, ์ํ ๊ธฐ๋ก |
Worker ์ํ ํ๋กํ ์ฝ
๊ฐ Worker๋ ํ์ผ ๊ธฐ๋ฐ ์ํ ๋จธ์ ์ ํตํด ๋ผ์ดํ์ฌ์ดํด์ ๊ด๋ฆฌํ๋ค:
stateDiagram-v2 [*] --> spawned: tmux pane ์์ฑ spawned --> ack: Worker ๋ถํธ์คํธ๋ฉ ์๋ฃ, ACK ์ ์ก ack --> idle: Leader๊ฐ ACK ํ์ธ idle --> claimed: task ํ ๋น ์๋ฝ claimed --> executing: ์์ ์์ executing --> complete: ์์ ์๋ฃ complete --> idle: ๋ค์ task ๋๊ธฐ idle --> shutdown: ๋ชจ๋ task ์๋ฃ ๋๋ Leader ์ง์ executing --> failed: ์๋ฌ ๋ฐ์ failed --> idle: ์ฌ์๋ ๊ฐ๋ฅ ์ shutdown --> [*]
ACK ๋ฉ์ปค๋์ฆ: Worker๊ฐ ์คํฐ๋ ํ ๋ถํธ์คํธ๋ฉ์ ์๋ฃํ๋ฉด worker/{id}/status.json์ ACK๋ฅผ ๊ธฐ๋กํ๋ค. Leader(runtime.ts)๋ ์ด ACK๋ฅผ ํ์ธํ ํ์๋ง task๋ฅผ ๋ถ๋ฐฐํ๋ค. ํ์์์ ๋ด์ ACK๊ฐ ์์ผ๋ฉด Worker๋ฅผ ์คํจ๋ก ์ฒ๋ฆฌํ๋ค.
Worker Bootstrap (์์ค: src/team/worker-bootstrap.ts)
๋ถํธ์คํธ๋ฉ ๊ณผ์
Worker๊ฐ tmux pane์์ ์์๋ ๋ ์ํ๋๋ ์ด๊ธฐํ ๋จ๊ณ:
- AGENTS.md ์ค๋ฒ๋ ์ด ์ฃผ์
โ Leader์ AGENTS.md์ Team ์ ์ฉ ์ง์นจ์ ์ถ๊ฐํ์ฌ Worker์
AGENTS.md๋ก ์ฃผ์ - ์ญํ ํ๋กฌํํธ ๋ก๋ฉ โ
role-router.ts๊ฐ Worker ์ญํ ์ ๋ง๋ ํ๋กฌํํธ(prompts/*.md)๋ฅผ ์ ํ - ๋ชจ๋ธ/ํ๋๊ทธ ์ค์ โ
model-contract.ts์ ํด์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ--model,--full-auto๋ฑ ํ๋๊ทธ ์ค์ - inbox ์์ฑ โ
worker/{id}/inbox/๋๋ ํ ๋ฆฌ์ ์ด๊ธฐ task ํ์ผ ๋ฐฐ์น
inbox ๊ธฐ๋ฐ task ๋ถ๋ฐฐ
.omx/state/team/worker/{worker-id}/
โโโ identity.json # Worker ์๋ณ ์ ๋ณด (role, model, spawn ์๊ฐ)
โโโ heartbeat.json # ์ฃผ๊ธฐ์ ์์กด ์ ํธ
โโโ status.json # ํ์ฌ ์ํ (idle, executing, complete ๋ฑ)
โโโ inbox/ # Leader๊ฐ task๋ฅผ ๋ฃ์ผ๋ฉด Worker๊ฐ ๊ฐ์ ธ๊ฐ
โโโ task-001.json
โโโ task-002.json
Worker๋ inbox/ ๋๋ ํ ๋ฆฌ๋ฅผ ํด๋งํ์ฌ ์ task๋ฅผ ๊ฐ์งํ๊ณ , claim โ execute โ complete ์์๋ก ์ฒ๋ฆฌํ๋ค.
ํ์ผ ๊ธฐ๋ฐ ํต์ (์์ค: src/team/mcp-comm.ts)
Worker ๊ฐ ์กฐ์จ ๋ฉ์ปค๋์ฆ
Team ๋ชจ๋์ ํต์ ์ MCP ์๋ฒ๊ฐ ์๋ ํ์ผ ์์คํ ๊ธฐ๋ฐ ๋ฉ์์ง์ด๋ค:
| ์ฑ๋ | ๋ฐฉํฅ | ์ฉ๋ |
|---|---|---|
inbox/ | Leader โ Worker | task ๋ถ๋ฐฐ, ์ง์ ์ ๋ฌ |
mailbox/ | Worker โ Leader | ์๋ฃ ๋ณด๊ณ , ๊ฒฐ๊ณผ ๋ฐํ |
status.json | Worker โ Leader | ์ํ ์ ๋ฐ์ดํธ (ํด๋ง) |
heartbeat.json | Worker โ Leader | ์์กด ์ ํธ |
dispatch ํจ์
mcp-comm.ts์ dispatch()๋ Leader๊ฐ Worker์๊ฒ task๋ฅผ ์ ๋ฌํ๋ ํต์ฌ ํจ์๋ค:
// 1. task JSON์ worker/{id}/inbox/task-{n}.json์ ๊ธฐ๋ก
// 2. Worker๊ฐ ํด๋ง์ผ๋ก ๊ฐ์ง
// 3. Worker๊ฐ claimํ๋ฉด status.json์ "claimed"๋ก ๋ณ๊ฒฝ
// 4. ์๋ฃ ์ mailbox/์ ๊ฒฐ๊ณผ ๊ธฐ๋ก์ด ์ค๊ณ๋ MCP ์๋ฒ ์์กด ์์ด ์์ ํ์ผ I/O๋ง์ผ๋ก ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ๊ตฌํํ๋ค. ๋จ์ํ์ง๋ง tmux pane ๊ฐ ๊ฒฉ๋ฆฌ๋ฅผ ์ ์งํ๋ฉด์๋ ์์ ์ ์ธ ์กฐ์จ์ด ๊ฐ๋ฅํ๋ค.
Model Contract (์์ค: src/team/model-contract.ts)
Worker ๋ชจ๋ธ ํด์ ์ฐ์ ์์
Worker๊ฐ ์ฌ์ฉํ LLM ๋ชจ๋ธ์ 3๋จ๊ณ ์ฐ์ ์์๋ก ๊ฒฐ์ ๋๋ค:
| ์์ | ์์ค | ํ๊ฒฝ ๋ณ์ | ์์ |
|---|---|---|---|
| 1 | ๋ช ์์ launch ์ธ์ | OMX_TEAM_WORKER_LAUNCH_ARGS | --model o3 |
| 2 | Leader์์ ์์ | --model (Leader ์คํ ์) | Leader๊ฐ o3์ด๋ฉด Worker๋ o3 |
| 3 | ๊ธฐ๋ณธ Spark ๋ชจ๋ธ | OMX_DEFAULT_SPARK_MODEL | o4-mini ๋ฑ |
Leader / Worker ๋ชจ๋ธ ๋ถ๋ฆฌ
| ์ญํ | ํ๊ฒฝ ๋ณ์ | ์๋ฏธ |
|---|---|---|
| Leader (๊ณํยท๊ฒ์ฆ) | OMX_DEFAULT_FRONTIER_MODEL | ๋์ ์ถ๋ก ๋ฅ๋ ฅ์ด ํ์ํ ์์ |
| Worker (์คํ) | OMX_DEFAULT_SPARK_MODEL | ๋น ๋ฅด๊ณ ๋น์ฉ ํจ์จ์ ์ธ ์ฝ๋ ์์ฑ |
resolveTeamWorkerLaunchArgs()๊ฐ ์ ์ฐ์ ์์๋ฅผ ์ ์ฉํ์ฌ Worker CLI ์ธ์๋ฅผ ๊ฒฐ์ ํ๋ค. resolveTeamLowComplexityDefaultModel()์ ๋จ์ ์์
์ ๋ ๊ฐ๋ฒผ์ด ๋ชจ๋ธ์ ์ ํํ๋ค.
Team ์ํ ๊ตฌ์กฐ (์์ค: src/team/state.ts)
.omx/state/team/ ์ ์ฒด ๋งต
.omx/state/team/
โโโ config.json # TeamConfig โ ์ด๋ฆ, Worker ์, ๊ฑฐ๋ฒ๋์ค, ์ ์ฑ
โโโ manifest-{timestamp}.json # TeamManifest โ Worker ๋ชฉ๋ก, ์ญํ , ๋ชจ๋ธ ์ ๋ณด
โโโ worker/
โ โโโ {worker-id}/
โ โโโ identity.json # ์ญํ , ๋ชจ๋ธ, ์คํฐ ์๊ฐ
โ โโโ heartbeat.json # ๋ง์ง๋ง ํ๋ ์๊ฐ, ์๋ต ์ฌ๋ถ
โ โโโ status.json # ํ์ฌ ์ํ + ํ์ฌ task ์ ๋ณด
โ โโโ inbox/ # ๋๊ธฐ ์ค์ธ task ํ์ผ๋ค
โโโ tasks/
โ โโโ {task-id}.json # TaskDefinition โ ์ค๋ช
, ์์กด์ฑ, ํ ๋น Worker
โโโ phase/
โ โโโ current.json # ํ์ฌ pipeline phase + ๋ฉํ๋ฐ์ดํฐ
โโโ events/
โ โโโ event-{timestamp}.jsonl # Team ์ด๋ฒคํธ ๋ก๊ทธ
โโโ shutdown/
โโโ signal.json # ์
ง๋ค์ด ์กฐ์จ (graceful shutdown ์ ํธ)
ํต์ฌ ์ธํฐํ์ด์ค
interface TeamConfig {
name: string;
workerCount: number;
governance: string; // 'leader-driven' | 'consensus'
policy: AllocationPolicy; // task ํ ๋น ์ ๋ต
}
interface WorkerInfo {
id: string;
role: string; // 'executor', 'tester' ๋ฑ
model: string; // ํด์๋ ๋ชจ๋ธ๋ช
tmuxPane: string; // tmux pane ์๋ณ์
status: WorkerStatus;
currentTask?: string;
}
interface TeamTask {
id: string;
description: string;
dependencies: string[]; // ์ ํ task ID ๋ชฉ๋ก
assignedWorker?: string;
status: 'pending' | 'claimed' | 'executing' | 'complete' | 'failed';
}Role Router (์์ค: src/team/role-router.ts)
Task๋ฅผ Worker์๊ฒ ๋ถ๋ฐฐํ ๋, role-router.ts๊ฐ ํค์๋ ํด๋ฆฌ์คํฑ์ผ๋ก ์ ํฉํ ์ญํ ์ ๊ฒฐ์ ํ๋ค:
| ํค์๋ ํจํด | ๋ผ์ฐํ ์ญํ | ๊ทผ๊ฑฐ |
|---|---|---|
test, spec, coverage | tester | ํ ์คํธ ๊ด๋ จ ์์ |
refactor, implement, build | executor | ๊ตฌํ ์์ |
design, plan, architecture | architect | ์ค๊ณ ์์ |
review, verify, check | verifier | ๊ฒ์ฆ ์์ |
CLI์์ omx team 3:executor "..." ์ฒ๋ผ ์ญํ ์ ๋ช
์ํ๋ฉด ๋ผ์ฐํฐ๋ฅผ ์ฐํํ๊ณ ํด๋น ์ญํ ๋ก ์ง์ ๋ฐฐ์ ๋๋ค.
Worker CLI ์ ํ๊ณผ Git Worktree ๊ฒฉ๋ฆฌ
Worker CLI ์ ํ
// OMX_TEAM_WORKER_CLI ํ๊ฒฝ ๋ณ์
// 'codex' โ Codex CLI (๊ธฐ๋ณธ)
// 'claude' โ Claude Code CLI
// 'auto' โ ์ํฉ์ ๋ฐ๋ผ ์๋ ์ ํWorker๋ ๋ฐ๋์ Codex CLI์ผ ํ์๊ฐ ์๋ค. OMX_TEAM_WORKER_CLI=claude๋ก ์ค์ ํ๋ฉด Claude Code๋ฅผ Worker๋ก ์ฌ์ฉํ ์ ์๋ค.
Git Worktree ๊ฒฉ๋ฆฌ (์์ค: src/team/worktree.ts)
๊ฐ Worker๊ฐ ๊ฐ์ ํ์ผ์ ๋์์ ์์ ํ๋ฉด ์ถฉ๋์ด ๋ฐ์ํ๋ค. worktree.ts๊ฐ Worker๋ณ ๋
๋ฆฝ Git worktree๋ฅผ ์์ฑํ์ฌ ์ด๋ฅผ ๋ฐฉ์งํ๋ค:
project/ # ๋ฉ์ธ ๋ฆฌํฌ์งํ ๋ฆฌ (Leader)
project-worker-1/ # Worker 1์ worktree (๋
๋ฆฝ ๋ธ๋์น)
project-worker-2/ # Worker 2์ worktree (๋
๋ฆฝ ๋ธ๋์น)
- ๊ฐ Worker๋ ์์ ๋ง์ ์์ ๋๋ ํ ๋ฆฌ์ ๋ธ๋์น์์ ์์
- ์๋ฃ ํ Leader๊ฐ merge ๋๋ cherry-pick์ผ๋ก ํตํฉ
- ๋ธ๋์น ๋ณด์กด ์ ์ฑ : Ralph + Team ์ฐ๊ณ ์ ๊ฒ์ฆ ์คํจํ ๋ธ๋์น๋ ๋ณด์กด
4๊ฐ์ง ๋ณ๋ ฌ ํจํด ๋น๊ต
| ํญ๋ชฉ | Ultrawork | Team | Autopilot | Ralph |
|---|---|---|---|---|
| ๊ฒฉ๋ฆฌ ์์ค | ๊ณต์ ์ปจํ ์คํธ (์ธํ๋ก์ธ์ค) | ์์ ๊ฒฉ๋ฆฌ (๋ ๋ฆฝ ํ๋ก์ธ์ค) | ๋จ๊ณ๋ณ ๊ฒฉ๋ฆฌ | ๋ฃจํ๋ณ ๊ฒฉ๋ฆฌ |
| Worker ์คํ | ๊ฐ์ Codex ํ๋ก์ธ์ค ๋ด | ๋ ๋ฆฝ tmux pane | ํผํฉ | ultrawork ๋ด๋ถ ์์ |
| ํต์ | ์ง์ ๊ฒฐ๊ณผ ๋ฐํ | ํ์ผ ๊ธฐ๋ฐ (inbox/mailbox) | ์ง์ + MCP | ์ง์ + architect ๊ฒ์ฆ |
| ํ์ฅ์ฑ | ํ๋ก์ธ์ค ๋ด ํ๊ณ | N Worker ์ํ ํ์ฅ | 5๋จ๊ณ ์์ฐจ, ๋จ๊ณ ๋ด ๋ณ๋ ฌ | while(!verified) ๋ฃจํ |
| ์ํ ๊ด๋ฆฌ | ๋ชจ๋ ์ํ๋ง | .omx/state/team/ ์ ์ฒด | ๋ชจ๋ ์ํ | Ralph phase contract |
| ์ ํฉ ์์ | ๋จ์ผ ์์ ์ ๋ณ๋ ฌ ๋ถํด | ๋๊ท๋ชจ ๋ฉํฐํ์คํฌ | ์ ์ฒด ์๋ํ ํ์ดํ๋ผ์ธ | ํ์ง ๋ณด์ฆ์ด ํ์ํ ์์ |
Ralph + Team ์ฐ๊ณ
omx team ralph ... โ ๊ฒ์ฆ ๋ฃจํ + ๋ณ๋ ฌ ์คํ์ ๊ฒฐํฉ
sequenceDiagram autonumber participant U as User participant RL as Ralph (๊ฒ์ฆ ๋ฃจํ) participant TM as Team Runtime participant W1 as Worker 1 participant W2 as Worker 2 U->>RL: "omx team ralph 2:executor build API" RL->>RL: Planning Gate ํ์ธ (PRD + test-spec, 6ํธ) RL->>TM: team-exec ์์ TM->>W1: ์๋ธํ์คํฌ 1 ๋ถ๋ฐฐ TM->>W2: ์๋ธํ์คํฌ 2 ๋ถ๋ฐฐ W1-->>TM: ์๋ฃ W2-->>TM: ์๋ฃ TM-->>RL: team-exec ์๋ฃ RL->>RL: team-verify (๊ฒ์ฆ) alt ๊ฒ์ฆ ์คํจ RL->>TM: team-fix ์์ TM->>W1: ์์ ์์ ๋ถ๋ฐฐ W1-->>TM: ์์ ์๋ฃ TM-->>RL: team-fix ์๋ฃ RL->>RL: ์ฌ๊ฒ์ฆ (๋ฃจํ) else ๊ฒ์ฆ ํต๊ณผ RL-->>U: ์๋ฃ end
linked team cleanup policy
Ralph๊ฐ Team์ ๊ฐ์ธ๋ ๊ฒฝ์ฐ, Ralph์ ์ข ๋ฃ(complete/cancelled) ์ Team ๋ฆฌ์์ค๋ ํจ๊ป ์ ๋ฆฌ๋๋ค:
- tmux session ์ข ๋ฃ
- Worker worktree ์ ๋ฆฌ (merge ์๋ฃ๋ ๊ฒ๋ง)
- ๊ฒ์ฆ ์คํจ ๋ธ๋์น๋ ๋ณด์กด (๋๋ฒ๊น ์ฉ)
์ถ์ฒ ์ํฌํ๋ก์ฐ: High-Control ์ฒด์ธ
ralplan (์คํ ์์ฑ) โ team (๋ณ๋ ฌ ์คํ) โ ralph (์ง์ ๊ฒ์ฆ)
ralplan์ผ๋ก PRD + test-spec์ ๋จผ์ ์์ฑํ์ฌ Planning Gate๋ฅผ ํต๊ณผ์ํจ ํ, Team ๋ชจ๋๋ก N Worker ๋ณ๋ ฌ ์คํ, Ralph ๋ฃจํ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ง์ ๊ฒ์ฆํ๋ ํจํด์ด๋ค. ๊ณํ ํต์ ๋ฅผ ์ ์งํ๋ฉด์ Worker ๋ณ๋ ฌ์ฑ์ ์ต๋ํ ํ์ฉํ๋ OMX์ ๊ฐ์ฅ ๊ณ ๋ํ๋ ์ํฌํ๋ก์ฐ๋ค.
Dynamic Scaling๊ณผ Idle Nudge
๋์ ์ค์ผ์ผ๋ง (์์ค: src/team/scaling.ts)
Worker ์๋ฅผ ๋ฐํ์์ ๋์ ์ผ๋ก ์กฐ์ ํ๋ ๊ธฐ๋ฅ์ด๋ค. ํ์ฌ ํ๊ฒฝ ๋ณ์ ๊ฒ์ดํธ ๋ค์ ์จ๊ฒจ์ ธ ์๋ค:
// OMX_TEAM_DYNAMIC_SCALING=true ์ผ ๋๋ง ํ์ฑํ
// - ๋จ์ task ๋๋น idle Worker ๋น์จ ๊ณ์ฐ
// - ํ์ ์ Worker ์ถ๊ฐ ์คํฐ ๋๋ idle Worker ์
ง๋ค์ดIdle Nudge (์์ค: src/team/idle-nudge.ts)
Worker๊ฐ ์ผ์ ์๊ฐ ์ด์ idle ์ํ๋ฅผ ์ ์งํ๋ฉด, Leader๊ฐ nudge ๋ฉ์์ง๋ฅผ inbox์ ๋ฃ์ด Worker์ ํ๋์ ์ด๊ตฌํ๋ค. OMC์๋ ์๋ OMX ๊ณ ์ ๊ธฐ๋ฅ์ด๋ค.
HUD โ Team ๋ชจ๋ํฐ๋ง ๋์๋ณด๋
src/hud/ ๋๋ ํ ๋ฆฌ๊ฐ Team ์คํ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ํ๋ ๋์๋ณด๋๋ฅผ ์ ๊ณตํ๋ค:
- Worker๋ณ ํ์ฌ ์ํ, ์งํ ์ค์ธ task
- Phase ์งํ๋ฅ
- ํ ํฐ ์ฌ์ฉ๋, ๊ฒฝ๊ณผ ์๊ฐ
- sparkshell(8ํธ)๊ณผ ์ฐ๋ํ์ฌ ํฐ๋ฏธ๋ ๊ธฐ๋ฐ ๋ชจ๋ํฐ๋ง ์ ๊ณต
CLI ์ธํฐํ์ด์ค (์์ค: src/cli/team.ts)
| ๋ช ๋ น์ด | ๋์ |
|---|---|
omx team <count>:<role> "<task>" | Team ๋ชจ๋ ์์ (Worker ์, ์ญํ , ์์ ์ง์ ) |
omx team status | ํ์ฌ Team ์ํ ์กฐํ |
omx team resume | ์ค๋จ๋ Team ์ฌ๊ฐ |
omx team shutdown | ๋ชจ๋ Worker ์ข ๋ฃ (graceful) |
omx team shutdown์ shutdown/signal.json์ ์ ํธ๋ฅผ ๊ธฐ๋กํ๊ณ , ๊ฐ Worker๊ฐ ํ์ฌ ์์
์ ๋ง์น ํ ์์ฐจ์ ์ผ๋ก ์ข
๋ฃํ๋ค.
OMC Team๊ณผ์ ๋น๊ต
| ํญ๋ชฉ | OMC Team | OMX Team |
|---|---|---|
| Worker ์์ฑ | tmux + claude CLI ์คํฐ | tmux + codex CLI ์คํฐ (๋๋ claude) |
| ์์ ๋ถ๋ฐฐ | ๊ณต์ task list | ํ์ผ ๊ธฐ๋ฐ inbox/mailbox |
| ํต์ | shared-memory MCP | ํ์ผ I/O + MCP ์ํ ๊ณต์ |
| CLI ์ ์ด | Skill ๋ด๋ถ ์ง์ | omx team ๋
๋ฆฝ CLI ์๋ธ์ปค๋งจ๋ |
| Worker ์ ์กฐ์ | ์๋ | scaling.ts ๋์ ์ค์ผ์ผ๋ง (๊ฒ์ดํธ) |
| ํ์ ๊ณํ | ์์ | followup-planner.ts |
| Idle ์ฒ๋ฆฌ | ์์ | idle-nudge.ts |
| Git ๊ฒฉ๋ฆฌ | ์์ | worktree.ts Git worktree |
| Phase ๊ด๋ฆฌ | ์์ | 5-Phase ํ์ดํ๋ผ์ธ + ์ํ ๋จธ์ |
| ๋ชจ๋ธ ๊ณ์ฝ | ์์ | model-contract.ts (Leader/Worker ๋ถ๋ฆฌ) |
ํต์ฌ ์ฐจ์ด: OMC๋ Team์ Skill ๋ด๋ถ ์ง์๋ก ๊ตฌ๋ํ์ง๋ง, OMX๋ ๋ ๋ฆฝ CLI + 5-Phase ํ์ดํ๋ผ์ธ + ํ์ผ ๊ธฐ๋ฐ ํต์ ์ผ๋ก ๊ตฌ์กฐํ๋ ์ค์ผ์คํธ๋ ์ด์ ์ ์ ๊ณตํ๋ค. ํนํ Git worktree ๊ฒฉ๋ฆฌ, dynamic scaling, idle nudge, followup planner ๋ฑ OMC์ ์๋ ์ธํ๋ผ๊ฐ ์ถ๊ฐ๋์ด ์๋ค.