# ๐Ÿ› ๏ธ Multi-Agent Mux (MAM) ์„ค์น˜ ๋ฐ ์ ์šฉ ๊ฐ€์ด๋“œ MAM์€ ๋‹จ์ผ ์›Œํฌ์ŠคํŽ˜์ด์Šค ์ƒ์—์„œ ๋ณต์ˆ˜์˜ ์—์ด์ „ํŠธ(Claude, Cline, Agy, Hermes ๋“ฑ)๋“ค์ด ์„œ๋กœ์˜ ์ƒํƒœ๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๊ณ  ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ ๋ฐ ๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋Š” ๊ธฐ์กด์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ/๋ ˆํฌ์ง€ํ† ๋ฆฌ์— MAM์„ ์‹ ์†ํ•˜๊ฒŒ ๋„์ž…ํ•˜๊ณ  ์ ์šฉํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. --- ## 1. โš™๏ธ ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ MAM ์Šคํ‚ฌ ๋ฐ ์Šคํฌ๋ฆฝํŠธ๋“ค์€ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ๋‹ค์Œ ๋„๊ตฌ๋“ค์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ์ „์— ํ™•์ธํ•ด ์ฃผ์„ธ์š”. * **herdr**: ์—์ด์ „ํŠธ๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๊ฒฉ๋ฆฌ Pane/Workspace์—์„œ ๊ตฌ๋™ ๋ฐ ๊ด€์ œํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ์„ธ์Šค ์ปจํ…Œ์ด๋„ˆ * **python3**: ์„ธ์…˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ(YAML/SQLite DB) ํŒŒ์‹ฑ ๋ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (๋‚ด์žฅ `sqlite3` ๋ชจ๋“ˆ ํ•„์ˆ˜) * **uuidgen**: ๊ฒฉ๋ฆฌ ์„ธ์…˜ ์ƒ์„ฑ ์‹œ ๊ณ ์œ ์˜ UUID ํ• ๋‹น * **rsync**: ์ธ์Šคํ†จ๋Ÿฌ(`deploy/install_mam.sh`)๊ฐ€ `.agents/` ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ๋ฐ ์Šคํ‚ฌ ํด๋”๋ฅผ ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ์— ๋ณต์ œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ (์„ค์น˜ ์‹œ ํ•„์š”) * **python3-yaml (pyyaml)**: ์„ธ์…˜ ๋ฐ์ดํ„ฐ YAML ์ €์žฅ ๋ฐ ๋กœ๋“œ ์˜์กด์„ฑ (`pip install pyyaml`) --- ## 2. ๐Ÿš€ ์ž๋™ ์„ค์น˜ ๋ฐฉ๋ฒ• MAM์˜ ์ž๋™ ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ(`deploy/install_mam.sh`)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 10์ดˆ ๋งŒ์— ํ•„์š”ํ•œ ๊ทœ์น™๊ณผ ๋ผ์ดํ”„์‚ฌ์ดํด ํˆดํ‚ท์„ ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ์— ์ด์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์‹œ์Šคํ…œ์˜ `herdr`, `python3`, `rsync`, `uuidgen` ๋ฐ ํ•„์ˆ˜ ํŒŒ์ด์ฌ ๋ชจ๋“ˆ๋“ค์„ ์ง„๋‹จํ•ฉ๋‹ˆ๋‹ค. > [!IMPORTANT] > **์„ค์น˜ ์ „์ œ์กฐ๊ฑด**: MAM ์Šคํ‚ฌ์„ ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•˜๋ ค๋ฉด **๋จผ์ € MAM ๋ ˆํฌ์ง€ํ† ๋ฆฌ๊ฐ€ ๋กœ์ปฌ ๋จธ์‹ ์— clone ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.** ### ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ MAM ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ```bash # ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• (ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ ์ง€์ •) $ bash deploy/install_mam.sh --target /path/to/your/project # ๋งŒ์•ฝ ์ด๋ฏธ ํƒ€๊ฒŸ์— AGENTS.md ๊ฐ€ ์กด์žฌํ•˜์—ฌ ๊ฐ•์ œ๋กœ ๋ฎ์–ด์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด: $ bash deploy/install_mam.sh --target /path/to/your/project --force ``` ### ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…: 1. **์˜์กด์„ฑ ์ง„๋‹จ**: ์‹œ์Šคํ…œ์— `herdr`, `python3`, `rsync`, `uuidgen` CLI ๋ฐ”์ด๋„ˆ๋ฆฌ์™€ ํŒŒ์ด์ฌ `pyyaml`/`sqlite3` ๋ชจ๋“ˆ์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. 2. **๊ทœ์น™ ๋ฐ ์Šคํ‚ฌ ๋ณต์ œ**: ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ(`.agents/` ํ•˜์œ„ ์ „์ฒด)๋ฅผ ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ ํ•˜์œ„๋กœ ์ด์‹ํ•ฉ๋‹ˆ๋‹ค. 3. **์ง€์นจ ์ „ํŒŒ**: ์—์ด์ „ํŠธ๊ฐ€ ๋กœ๋“œํ•˜๊ณ  ๋ณต์ข…ํ•  ํ–‰๋™ ์ง€์นจ ๋ฌธ์„œ(`AGENTS.md`)๋ฅผ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. 4. **ํ˜•์ƒ ์ œ์™ธ ์„ค์ •**: ์„ธ์…˜ DB ๋ฐ ๊ฒฉ๋ฆฌ ์บ์‹œ ์ €์žฅ์†Œ์ธ `.mam/` ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ์˜ `.gitignore` ์— ์ž๋™ ์ฃผ์ž…ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ํ˜•์ƒ ๊ด€๋ฆฌ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. --- ## 3. ๐ŸŽฏ ํ•ต์‹ฌ ์‚ฌ์šฉ ์›Œํฌํ”Œ๋กœ์šฐ (Quick Start) ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ ์—์ด์ „ํŠธ๋“ค์„ ๊ธฐ๋™ ๋ฐ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### 1) ์—์ด์ „ํŠธ ๊ฒฉ๋ฆฌ ์„ธ์…˜ ์ƒ์„ฑ (Create) ์ƒˆ๋กœ์šด ์—์ด์ „ํŠธ๋ฅผ ๋…๋ฆฝ๋œ ๊ฒฉ๋ฆฌ ๊ฐ€์ƒ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋„์›๋‹ˆ๋‹ค. ```bash $ bash .agents/skills/multi-agent-mux-create/scripts/create_session.sh \ --workspace "/path/to/your/project" \ --agent claude \ --role developer \ --session my-project-dev-claude \ --herdr-server multi-agent-mux ``` * ๋ชจ๋“  ์„ธ์…˜์€ ์‚ฌ์šฉ์ž์˜ ์ „์—ญ ์—์ด์ „ํŠธ ์„ค์ •(Global Config)์„ ๊ณต์œ ํ•˜๋ฉฐ, herdr ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ ๋ฐ ๋Œ€ํ™” UUID ๋‹จ์œ„๋กœ ๋…๋ฆฝ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค. ### 2) ์„ธ์…˜ ์ ‘์† (Attach) ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๊ตฌ๋™๋œ ์—์ด์ „ํŠธ TUI ํ™”๋ฉด์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ```bash $ herdr session attach my-project-dev-claude ``` * **ํ™”๋ฉด ํƒˆ์ถœ**: ๋Œ€ํ™” ์ค‘ ์„ธ์…˜์„ ์œ ์ง€ํ•œ ์ฑ„ ํ„ฐ๋ฏธ๋„๋กœ ๋Œ์•„์˜ค๋ ค๋ฉด `Ctrl + B`๋ฅผ ๋ˆ„๋ฅธ ๋’ค `D` ํ‚ค๋ฅผ ์ฐจ๋ก€๋กœ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ### 3) ์—์ด์ „ํŠธ ์ƒํƒœ ๋ณต์› (Resume) ์„ธ์…˜์ด ์ค‘์ง€๋˜์—ˆ๊ฑฐ๋‚˜, ํ˜ธ์ŠคํŠธ ์žฌ๊ธฐ๋™์œผ๋กœ herdr ์„œ๋ฒ„๊ฐ€ ์†Œ๋ฉธํ•œ ๊ฒฝ์šฐ์—๋„ ์ด์ „ ๋Œ€ํ™” ID๋ฅผ ์›์ž์ ์œผ๋กœ ์ด์–ด๋ฐ›์•„ ๋‹ค์‹œ ๊ธฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```bash # 1๋‹จ๊ณ„: ๋ณต์› ๋Œ€์ƒ ์„ธ์…˜์˜ UUID ์ž๋™ ์กฐํšŒ (DB/YAML ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ธฐ๋ฐ˜) $ WORKSPACE="/path/to/your/project" $ AGENT="claude" $ SESSION_NAME="my-project-dev-claude" $ UUID=$(bash .agents/skills/multi-agent-mux-resume/scripts/resolve_session_id.sh \ --workspace "$WORKSPACE" --agent "$AGENT" --session "$SESSION_NAME") # ๋ณต์› ๋Œ€์ƒ ์„ธ์…˜์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (M-1) $ [ -n "$UUID" ] || { echo "[ERROR] ๋งค์นญ๋˜๋Š” ํ™œ์„ฑ ์„ธ์…˜ ์ด๋ ฅ์ด ์—†์Šต๋‹ˆ๋‹ค. create_session.sh๋ฅผ ํ†ตํ•ด ๋จผ์ € ์„ธ์…˜์„ ์ƒ์„ฑํ•ด ์ฃผ์„ธ์š”."; exit 1; } # 2๋‹จ๊ณ„: ์„ธ์…˜ ์žฌ๊ธฐ๋™ (์ด์ „ ๋Œ€ํ™” ์ปจํ…์ŠคํŠธ ๋ณต์› ๊ธฐ๋™) $ herdr run -d --name "$SESSION_NAME" --workspace "$WORKSPACE" -- \ "claude --dangerously-skip-permissions -r $UUID" # 3๋‹จ๊ณ„: ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„ธ์…˜ ์ƒํƒœ๋ฅผ running ์œผ๋กœ ๋™๊ธฐํ™” ๊ฐฑ์‹  $ bash .agents/skills/multi-agent-mux-resume/scripts/update_yaml_resumed.sh \ --session "$SESSION_NAME" --uuid "$UUID" --agent "$AGENT" ``` ### 4) ์„ธ์…˜ ์ข…๋ฃŒ ๋ฐ ์ •๋ฆฌ (Stop / Purge) ์„ธ์…˜์„ ์ •์ง€์‹œํ‚ค๊ณ  ๋Œ€ํ™” ์ปจํ…์ŠคํŠธ๋ฅผ ๋™๊ฒฐํ•˜๊ฑฐ๋‚˜(default), ์™„์ „ํžˆ ์†Œ๋ฉธ์‹œํ‚ต๋‹ˆ๋‹ค(`--purge-conversation`). ```bash # ๋Œ€ํ™” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—… ๋ฐ ์˜์†ํ™”ํ•˜๊ณ , ์•ˆ์ „ํ•˜๊ฒŒ ์ข…๋ฃŒ (status=stopped) $ bash .agents/skills/multi-agent-mux-stop/scripts/stop_session.sh \ --session my-project-dev-claude --agent claude # ๋Œ€ํ™” ๋‚ด์šฉ ๋ฐ ๊ฒฉ๋ฆฌ ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์™„์ „ํžˆ ์ฒญ์†Œํ•˜๊ณ  ์ข…๋ฃŒ (status=terminated, resumable=false) $ bash .agents/skills/multi-agent-mux-stop/scripts/stop_session.sh \ --session my-project-dev-claude --agent claude --purge-conversation --yes ``` ### 5) ์ž์œจ ๋ฐ˜๋ณต ์ •์ œ ๋ฃจํ”„ ๊ธฐ๋™ (Mux-Loop) ๊ณ„ํš ์ˆ˜๋ฆฝ(Planner) โžœ ์ฝ”๋“œ ์ˆ˜์ •(Creator) โžœ ๊ต์ฐจ ๊ฒ€์ฆ(Reviewer) โžœ ์ˆ˜์ • ์ •์ œ ํ”ผ๋“œ๋ฐฑ์„ ๋‹จ์ผ ๋ช…๋ น์œผ๋กœ ์ž๋™ ์ˆœํ™˜ํ•˜๋Š” ๋ฐ˜๋ณต ์ •๋ฐ€ ๊ด€์ œ ๋ฃจํ”„๋ฅผ ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค. ```bash # ํ”Œ๋ž˜๋„ˆ ํ˜‘๋ ฅ ๊ณ„ํš ๋‹จ๊ณ„๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ , ๋ฆฌ๋ทฐ์–ด์˜ PASS ํ•ฉ์˜ ํ•˜์— ์ž์œจ ๋ฃจํ”„ ๊ตฌ๋™ (์ตœ๋Œ€ 3ํšŒ ๊ต์ •) $ bash .agents/skills/multi-agent-mux-loop/scripts/run_loop.sh \ --plan \ --plan-talk 1 \ --reviewer "reviewer-a,reviewer-b" \ --max-loop 3 \ --target-agent my-project-dev-claude \ --task "๊ตฌํ˜„ํ•  ๋ช…ํ™•ํ•œ ๊ฐœ๋ฐœ ์ž‘์—… ๋ชฉํ‘œ" ``` * `--max-loop`๋Š” ์ฝ”๋“œ ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ ์‹œ ์ตœ๋Œ€ ๊ต์ •(๋ฐ˜๋ณต ์ˆ˜์ •) ํšŸ์ˆ˜ ์ œํ•œ ๊ฐ€๋“œ๋ ˆ์ผ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. * **์ฐธ๊ณ **: ๋ฆฌ๋ทฐ ๋‹จ๊ณ„์—์„œ ์ฝ”๋“œ ๋ณ€๊ฒฝ๋ถ„์„ ์ •ํ™•ํ•˜๊ฒŒ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด, ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ๋Š” `git` ์ €์žฅ์†Œ๋กœ ๊ธฐ๋™ ๋ฐ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ### 6) ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ์˜จ๋ณด๋”ฉ (Orc-Onboard) ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ์—์ด์ „ํŠธ์˜ ๋Œ€ํ™” UUID๋ฅผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋“ฑ๋กํ•˜์—ฌ, ์„œ๋ธŒ์—์ด์ „ํŠธ ํƒ์ง€ ๋ฃจํ”„์—์„œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ๋Œ€ํ™”๊ฐ€ ์„œ๋ธŒ์—์ด์ „ํŠธ๋กœ ์˜คํƒ capture๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. ```bash # ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ ๋Œ€ํ™” UUID ์˜จ๋ณด๋”ฉ (์ž๋™ ํƒ์ง€ ๋˜๋Š” ๋ช…์‹œ์  ์ง€์ •) $ bash .agents/skills/multi-agent-mux-orc-onboard/scripts/orc_onboard.sh --uuid # ๋“ฑ๋ก๋œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ UUID ๋ชฉ๋ก ํ™•์ธ $ bash .agents/skills/multi-agent-mux-orc-onboard/scripts/orc_onboard.sh --list # ๋“ฑ๋ก๋œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ UUID ์ œ๊ฑฐ (์˜คํ”„๋ณด๋”ฉ) $ bash .agents/skills/multi-agent-mux-orc-onboard/scripts/orc_onboard.sh --remove ``` --- ## ๐Ÿ›ก๏ธ ํ˜‘์—… ๋ฐ ๋ณด์•ˆ ๊ฐ€์ด๋“œ๋ผ์ธ * MAM์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ชจ๋“  ์—์ด์ „ํŠธ(๊ฐœ๋ฐœ์ž, ๋ฆฌ๋ทฐ์–ด)๋“ค์€ ๋ฃจํŠธ์˜ `AGENTS.md` ์ง€์นจ์„ ์šฐ์„  ์ˆ™์ง€ํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ์˜คํƒ๊ณผ ๋ฌด๋ถ„๋ณ„ํ•œ ๋ฆฌํŒฉํ† ๋ง ๋ฒ”๋žŒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. * ๊ฐ ์—์ด์ „ํŠธ ์—ญํ• ๋ณ„๋กœ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ๋ฆด ์‹œ, ์ตœ์ข… ์Šน์ธ ๊ฒฐ๊ณผ ๋ณด๊ณ ์„œ(.md)๋Š” ํ˜•์ƒ ๊ด€๋ฆฌ๊ฐ€ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฒ„์ „ ๊ด€๋ฆฌ ๋Œ€์ƒ ๊ฒฝ๋กœ(๊ตฌ์ฒด์ ์œผ๋กœ `.agents/reports//` ๋˜๋Š” `docs/reports/` ๋“ฑ) ํ•˜์œ„๋กœ ์ด๊ด€ ๋ณต์‚ฌํ•˜์—ฌ ์ปค๋ฐ‹ํ•˜๋Š” ๊ทœ์•ฝ(`.agents/MULTI_AGENT_RULES.md`)์„ ์ค€์ˆ˜ํ•ด ์ฃผ์„ธ์š”.