์‹œ๋ฆฌ์ฆˆ: oh-my-codex ์•„ํ‚คํ…์ฒ˜ ํ•ด๋ถ€

์ด ์‹œ๋ฆฌ์ฆˆ๋Š” OpenAI Codex CLI ํ™•์žฅ ๋Ÿฐํƒ€์ž„์ธ oh-my-codex(OMX)์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ํ•ด๋ถ€ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

ํŽธ๋‚ด์šฉํ•ต์‹ฌ
0ํŽธOverview3-Plane ์•„ํ‚คํ…์ฒ˜, OMC์™€์˜ ์ฐจ์ด, ์ „์ฒด ํ๋ฆ„
1ํŽธCodex CLI FoundationCodex CLI ์ž์ฒด์˜ ๊ตฌ์กฐ์™€ ํ™•์žฅ ํฌ์ธํŠธ
2ํŽธOMX IntegrationOMX๊ฐ€ Codex์— ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋‚˜
3ํŽธSkill System์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•˜๋‚˜
4ํŽธPrompt & Agent System์—์ด์ „ํŠธ๋Š” ๋ญ๊ณ  ์–ด๋–ป๊ฒŒ ์„ ํƒ๋˜๋‚˜
5ํŽธMCP Servers์–ด๋–ค MCP ๋„๊ตฌ๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‚˜
6ํŽธState & Lifecycle์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ์œ ์ง€ํ•˜๋‚˜
7ํŽธ (๋ณธ๋ฌธ)Team OrchestrationTeam ๋ชจ๋“œ๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜
8ํŽธNative & SparkRust ๋„ค์ดํ‹ฐ๋ธŒ ๋„๊ตฌ๋Š” ๋ญ”๊ฐ€

  • 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-planarchitectํƒœ์Šคํฌ ๋ถ„ํ•ด, ์„œ๋ธŒํƒœ์Šคํฌ ์ •์˜
team-prdarchitectPRD, test-spec ๋ฌธ์„œ ์ƒ์„ฑ
team-execexecutor (๊ธฐ๋ณธ)์‹ค์ œ ์ฝ”๋“œ ์ž‘์—… ์ˆ˜ํ–‰
team-verifytester / verifier๊ฒฐ๊ณผ๋ฌผ ๊ฒ€์ฆ, ํ…Œ์ŠคํŠธ ์‹คํ–‰
team-fixexecutor๊ฒ€์ฆ ์‹คํŒจ ํ•ญ๋ชฉ ์ˆ˜์ •

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์—์„œ ์‹œ์ž‘๋  ๋•Œ ์ˆ˜ํ–‰๋˜๋Š” ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„:

  1. AGENTS.md ์˜ค๋ฒ„๋ ˆ์ด ์ฃผ์ž… โ€” Leader์˜ AGENTS.md์— Team ์ „์šฉ ์ง€์นจ์„ ์ถ”๊ฐ€ํ•˜์—ฌ Worker์˜ AGENTS.md๋กœ ์ฃผ์ž…
  2. ์—ญํ•  ํ”„๋กฌํ”„ํŠธ ๋กœ๋”ฉ โ€” role-router.ts๊ฐ€ Worker ์—ญํ• ์— ๋งž๋Š” ํ”„๋กฌํ”„ํŠธ(prompts/*.md)๋ฅผ ์„ ํƒ
  3. ๋ชจ๋ธ/ํ”Œ๋ž˜๊ทธ ์„ค์ • โ€” model-contract.ts์˜ ํ•ด์„ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ --model, --full-auto ๋“ฑ ํ”Œ๋ž˜๊ทธ ์„ค์ •
  4. 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 โ†’ Workertask ๋ถ„๋ฐฐ, ์ง€์‹œ ์ „๋‹ฌ
mailbox/Worker โ†’ Leader์™„๋ฃŒ ๋ณด๊ณ , ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
status.jsonWorker โ†’ Leader์ƒํƒœ ์—…๋ฐ์ดํŠธ (ํด๋ง)
heartbeat.jsonWorker โ†’ 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
2Leader์—์„œ ์ƒ์†--model (Leader ์‹คํ–‰ ์‹œ)Leader๊ฐ€ o3์ด๋ฉด Worker๋„ o3
3๊ธฐ๋ณธ Spark ๋ชจ๋ธOMX_DEFAULT_SPARK_MODELo4-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, coveragetesterํ…Œ์ŠคํŠธ ๊ด€๋ จ ์ž‘์—…
refactor, implement, buildexecutor๊ตฌํ˜„ ์ž‘์—…
design, plan, architecturearchitect์„ค๊ณ„ ์ž‘์—…
review, verify, checkverifier๊ฒ€์ฆ ์ž‘์—…

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๊ฐ€์ง€ ๋ณ‘๋ ฌ ํŒจํ„ด ๋น„๊ต

ํ•ญ๋ชฉUltraworkTeamAutopilotRalph
๊ฒฉ๋ฆฌ ์ˆ˜์ค€๊ณต์œ  ์ปจํ…์ŠคํŠธ (์ธํ”„๋กœ์„ธ์Šค)์™„์ „ ๊ฒฉ๋ฆฌ (๋…๋ฆฝ ํ”„๋กœ์„ธ์Šค)๋‹จ๊ณ„๋ณ„ ๊ฒฉ๋ฆฌ๋ฃจํ”„๋ณ„ ๊ฒฉ๋ฆฌ
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 TeamOMX 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์— ์—†๋Š” ์ธํ”„๋ผ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์žˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ