Skip to content

Latest commit

ย 

History

History
354 lines (256 loc) ยท 20.4 KB

File metadata and controls

354 lines (256 loc) ยท 20.4 KB

๋น ๋ฅธ ์‹œ์ž‘

English ยท Portuguรชs (Brasil) ยท Deutsch ยท Franรงais ยท ๆ—ฅๆœฌ่ชž ยท ํ•œ๊ตญ์–ด ยท ็ฎ€ไฝ“ไธญๆ–‡ ยท ็น้ซ”ไธญๆ–‡ ยท เธ เธฒเธฉเธฒเน„เธ—เธข

์ œํ’ˆ ์ „์ฒด๋ฅผ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•ด ๋ณด์„ธ์š”.

ํ™˜๊ฒฝ ์š”๊ตฌ์‚ฌํ•ญ

  • Node.js: ~24(Node 24.x). package.json#engines๋กœ ๋ฒ„์ „์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.
  • pnpm: 10.33.x. packageManager์— pnpm@10.33.2๋ฅผ ๊ณ ์ •ํ•ด ๋‘์—ˆ์œผ๋‹ˆ, Corepack์„ ์“ฐ๋ฉด ๊ณ ์ •๋œ ๋ฒ„์ „์ด ์ž๋™์œผ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.
  • OS: macOS, Linux, WSL2๊ฐ€ ์ฃผ์š” ์ง€์› ํ™˜๊ฒฝ์ž…๋‹ˆ๋‹ค. Windows ๋„ค์ดํ‹ฐ๋ธŒ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ž์ฃผ ๊ฒช๋Š” ์„ค์น˜ ๋ฌธ์ œ๋Š” docs/windows-troubleshooting.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • ์„ ํƒ: ๋กœ์ปฌ ์—์ด์ „ํŠธ CLI: Open Design์€ Claude Code, Codex, Devin for Terminal, OpenCode, Cursor Agent, Qwen, Qoder CLI, GitHub Copilot CLI ๋“ฑ์„ ๋กœ์ปฌ ๋Ÿฐํƒ€์ž„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชฉ๋ก์€ apps/daemon/src/runtimes/registry.ts์— ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋œ ๋Ÿฐํƒ€์ž„์ด ์—†์œผ๋ฉด Settings์—์„œ ๊ตฌ์„ฑํ•œ BYOK ๋Ÿฐํƒ€์ž„์„ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ์—์ด์ „ํŠธ CLI์™€ PATH

daemon์€ PATH(์—ฌ๊ธฐ์— ๋”ํ•ด ์ž์ฃผ ์“ฐ์ด๋Š” ์‚ฌ์šฉ์ž ํˆด์ฒด์ธ ๋””๋ ‰ํ„ฐ๋ฆฌ)๋ฅผ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค. **npm install -g**๋‚˜ Homebrew๋กœ CLI๋ฅผ ์„ค์น˜ํ–ˆ๋Š”๋ฐ๋„ Open Design์ด not installed๋กœ ํ‘œ์‹œํ•œ๋‹ค๋ฉด, GUI๊ฐ€ ์ตœ์†Œํ•œ์˜ PATH๋กœ ์‹œ์ž‘ํ•˜๋ฉด์„œ ์ „์—ญ npm์ด๋‚˜ Homebrew์˜ bin ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค(์•ฑ์ด ์ „์ฒด ๋กœ๊ทธ์ธ ์…ธ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š์€ macOS์—์„œ ํ”ํžˆ ๋ฐœ์ƒ). daemon์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์˜ PATH์— ์‹คํ–‰ ํŒŒ์ผ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๋“ค์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ ๋’ค, Settings โ†’ Execution mode์—์„œ Rescan์„ ๋ˆ„๋ฅด์„ธ์š”.

nvm / fnm์€ ํŽธ์˜๋ฅผ ์œ„ํ•œ ์„ ํƒ ๋„๊ตฌ์ผ ๋ฟ, ํ”„๋กœ์ ํŠธ ์„ค์ •์— ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์“ด๋‹ค๋ฉด pnpm์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— Node 24๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์„ ํƒํ•˜์„ธ์š”.

# nvm
nvm install 24
nvm use 24

# fnm
fnm install 24
fnm use 24

๊ทธ๋‹ค์Œ Corepack์„ ์ผœ๊ณ  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๊ฐ€ pnpm์„ ์„ ํƒํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

corepack enable
corepack pnpm --version   # 10.33.2๊ฐ€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

Docker ์„ค์ •

Node.js๋‚˜ pnpm์„ ๋กœ์ปฌ์— ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ ๋„, ์™„์ „ํžˆ ์ปจํ…Œ์ด๋„ˆํ™”๋œ ํ™˜๊ฒฝ์—์„œ Open Design์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ

  • Docker Desktop
  • Docker Compose v2

Docker๊ฐ€ ์ œ๋Œ€๋กœ ์„ค์น˜๋๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

docker compose version

Open Design ์‹œ์ž‘ํ•˜๊ธฐ

๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋ฃจํŠธ์—์„œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. deploy ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™ํ•œ ๋’ค ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ…œํ”Œ๋ฆฟ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

    cd deploy
    cp .env.example .env
  2. ์•ˆ์ „ํ•œ ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    openssl rand -hex 32
  3. ์—๋””ํ„ฐ์—์„œ .env๋ฅผ ์—ด๊ณ  OD_API_TOKEN=์„ ์ฐพ์•„, ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ ํ† ํฐ์„ ๋ถ™์—ฌ ๋„ฃ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

docker compose up -d

๋ธŒ๋ผ์šฐ์ €์—์„œ ์•ฑ์„ ์—ฝ๋‹ˆ๋‹ค.

http://localhost:7456

์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ๋Š” Docker๊ฐ€ ์ตœ์‹  ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์•„์˜ค๋А๋ผ ๋ช‡ ์ดˆ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ž์ฃผ ์“ฐ๋Š” Docker ๋ช…๋ น์–ด

๋กœ๊ทธ ๋ณด๊ธฐ

docker compose logs -f

์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘

docker compose restart

์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€

docker compose down

์ตœ์‹  ์ด๋ฏธ์ง€ ๋ฐ›์•„์˜ค๊ธฐ

docker compose pull
docker compose up -d

๋กœ์ปฌ ์•ฑ ๋ฐ์ดํ„ฐ ์ „๋ถ€ ์‚ญ์ œ

docker compose down -v

ํ™˜๊ฒฝ ์„ค์ •

๊ธฐ๋ณธ ์„ค์ •์„ ๋ฎ์–ด์“ฐ๋ ค๋ฉด deploy/.env ํŒŒ์ผ์„ ๋งŒ๋“œ์„ธ์š”. ์ œ๊ณต๋œ ์˜ˆ์‹œ์—์„œ ์‹œ์ž‘ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

cp deploy/.env.example deploy/.env

deploy/.env๋ฅผ ํŽธ์ง‘ํ•ด ์ง์ ‘ ๋งŒ๋“  ํ† ํฐ์„ ๋„ฃ๊ณ , ๋‚˜๋จธ์ง€ ๊ฐ’๋„ ํ•„์š”์— ๋งž๊ฒŒ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

# ํ˜ธ์ŠคํŠธ์— ๋…ธ์ถœํ•  ํฌํŠธ
OPEN_DESIGN_PORT=7456

# ์ปจํ…Œ์ด๋„ˆ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ
OPEN_DESIGN_MEM_LIMIT=384m

# ํ—ˆ์šฉํ•  CORS origin
OPEN_DESIGN_ALLOWED_ORIGINS=https://yourdomain.com

# Docker ์ด๋ฏธ์ง€ ํƒœ๊ทธ
OPEN_DESIGN_IMAGE=ghcr.io/nexu-io/od:latest

# daemon ๋ณด์•ˆ์— ํ•„์š”ํ•œ API ํ† ํฐ
# ์ƒ์„ฑ ๋ฐฉ๋ฒ•: openssl rand -hex 32
OD_API_TOKEN=

์˜๊ตฌ ์ €์žฅ์†Œ

์˜๊ตฌ daemon ์ €์žฅ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ฑฐ๋‚˜, ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์„ ํƒํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๋ฃจํŠธ AGENTS.md์˜ Daemon data directory contract๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด Quickstart๋Š” ๊ทธ ๊ณ„์•ฝ์„ ๋‹ค์‹œ ์„œ์ˆ ํ•˜๊ฑฐ๋‚˜ ์ €์žฅ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.


์ฐธ๊ณ 

  • Docker ๋ชจ๋“œ๋Š” ๋กœ์ปฌ์— Node.js๋‚˜ pnpm์„ ์„ค์น˜ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ๊ธฐ์—ฌ์ž์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ๋Š” ํ”„๋กœ๋•์…˜ daemon ๋นŒ๋“œ๋ฅผ 7456 ํฌํŠธ์— ์ง์ ‘ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๋” ๊นŠ์€ ๋กœ์ปฌ ์„ค์ •์€ ์ด ๋น ๋ฅธ ์‹œ์ž‘ ๊ฐ€์ด๋“œ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•˜๊ธฐ (dev ๋ชจ๋“œ)

corepack enable
pnpm install
pnpm tools-dev run web # daemon + web์„ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค
# tools-dev๊ฐ€ ์ถœ๋ ฅํ•œ web URL์„ ์—ฝ๋‹ˆ๋‹ค

๋ฐ์Šคํฌํ†ฑ ์…ธ๊ณผ ๊ด€๋ฆฌ ๋Œ€์ƒ sidecar ์ „๋ถ€๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด:

pnpm tools-dev # daemon + web + desktop์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค

์ฒ˜์Œ ๋กœ๋“œํ•  ๋•Œ ์•ฑ์€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋กœ์ปฌ ๋Ÿฐํƒ€์ž„์„ ๊ฐ์ง€ํ•˜๊ณ  Settings์—์„œ ๊ตฌ์„ฑํ•œ BYOK ๋Ÿฐํƒ€์ž„๋„ ํ•จ๊ป˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„, ๋””์ž์ธ ํ…œํ”Œ๋ฆฟ, ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์„ ํƒํ•˜๊ณ  ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•œ ๋’ค Send๋ฅผ ๋ˆ„๋ฅด์„ธ์š”. ๊ตฌ์กฐํ™”๋œ ๋กœ์ปฌ ๋Ÿฐํƒ€์ž„์€ ์ •์‹ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ์“ฐ๊ณ  ํŒŒ์ผ/๋„๊ตฌ ์ด๋ฒคํŠธ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋ฉฐ, ํŒŒ์ผ ์ž‘์—… ๊ณต๊ฐ„๊ณผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋Š” ๊ทธ ์“ฐ๊ธฐ์—์„œ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ์ „์šฉ ๋ฐ BYOK ์‹คํ–‰์€ ๋Œ€์‹  ํ˜ธ์ŠคํŠธ๊ฐ€ ํŒŒ์‹ฑํ•  ์™„์ „ํ•œ <artifact> ๋ธ”๋ก์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. artifact ์ €์žฅ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๋ฃจํŠธ AGENTS.md์˜ Daemon data directory contract๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Design systems ์นดํƒˆ๋กœ๊ทธ๋Š” design-systems/์˜ DESIGN.md ํŒจํ‚ค์ง€์—์„œ ์ง์ ‘ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๋ฉด ๊ทธ ๋ธŒ๋žœ๋“œ์˜ ์‹œ๊ฐ ์–ธ์–ด๊ฐ€ artifact์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

Templates ์นดํƒˆ๋กœ๊ทธ๋Š” design-templates/์—์„œ ์˜ค๋ฉฐ ํ”„๋กœํ† ํƒ€์ž…, deck, ๋ฌธ์„œ, ์ด๋ฏธ์ง€, ๋น„๋””์˜ค, ์˜ค๋””์˜ค artifact ํ˜•์‹์„ ๋ฌถ์–ด ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. skills/๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—… ์ค‘ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์  ์—ญ๋Ÿ‰์„ ์œ„ํ•œ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ๊ณผ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ํ•จ๊ป˜ ์„ ํƒํ•˜๋ฉด ์›ํ•˜๋Š” ์‹œ๊ฐ ์–ธ์–ด์˜ artifact๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋ฐ–์˜ ์Šคํฌ๋ฆฝํŠธ

pnpm tools-dev                 # daemon + web + desktop์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ
pnpm tools-dev start web       # daemon + web์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ
pnpm tools-dev run web         # daemon + web์„ ํฌ๊ทธ๋ผ์šด๋“œ๋กœ (e2e/dev ์„œ๋ฒ„)
pnpm tools-dev restart         # daemon + web + desktop ์žฌ์‹œ์ž‘
pnpm tools-dev restart --daemon-port 7457 --web-port 5175
pnpm tools-dev status          # ๊ด€๋ฆฌ ์ค‘์ธ ๋Ÿฐํƒ€์ž„ ํ™•์ธ
pnpm tools-dev logs            # daemon/web/desktop ๋กœ๊ทธ ๋ณด๊ธฐ
pnpm tools-dev check           # ์ƒํƒœ + ์ตœ๊ทผ ๋กœ๊ทธ + ์ผ๋ฐ˜ ์ง„๋‹จ
pnpm tools-dev stop            # ๊ด€๋ฆฌ ์ค‘์ธ ๋Ÿฐํƒ€์ž„ ์ค‘์ง€
pnpm --filter @open-design/daemon build  # `od`์šฉ apps/daemon/dist/cli.js ๋นŒ๋“œ
pnpm --filter @open-design/web build     # ํ•„์š”ํ•  ๋•Œ web ํŒจํ‚ค์ง€ ๋นŒ๋“œ
pnpm typecheck                 # ์›Œํฌ์ŠคํŽ˜์ด์Šค ํƒ€์ž… ์ฒดํฌ

๋กœ์ปฌ ๋ผ์ดํ”„์‚ฌ์ดํด์˜ ์ง„์ž…์ ์€ pnpm tools-dev ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค. ์‚ญ์ œ๋œ ์˜› ๋ฃจํŠธ alias(pnpm dev, pnpm dev:all, pnpm daemon, pnpm preview, pnpm start)๋Š” ์“ฐ์ง€ ๋งˆ์„ธ์š”.

๋กœ์ปฌ ๊ฐœ๋ฐœ ์ค‘์—๋Š” tools-dev๊ฐ€ daemon์„ ๋จผ์ € ๋„์šฐ๊ณ  ๊ทธ ํฌํŠธ๋ฅผ apps/web์— ๋„˜๊น๋‹ˆ๋‹ค. apps/web/next.config.ts๋Š” /api/*, /artifacts/*, /frames/*๋ฅผ ๊ทธ daemon ํฌํŠธ๋กœ ๋‹ค์‹œ ๋งคํ•‘ํ•˜๋ฏ€๋กœ, App Router ์•ฑ์ด CORS ์„ค์ • ์—†์ด๋„ ์˜†์—์„œ ๋„๋Š” Express ํ”„๋กœ์„ธ์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฏธ๋””์–ด ์ƒ์„ฑ / ์—์ด์ „ํŠธ dispatcher ์ ๊ฒ€

์ด๋ฏธ์ง€, ๋น„๋””์˜ค, ์˜ค๋””์˜ค, HyperFrames skill์€ daemon์ด ์—์ด์ „ํŠธ๋ฅผ spawnํ•  ๋•Œ ์ฃผ์ž…ํ•˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ od CLI๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

  • OD_BIN โ€” apps/daemon/dist/cli.js์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ.
  • OD_DAEMON_URL โ€” ์‹คํ–‰ ์ค‘์ธ daemon URL.
  • OD_PROJECT_ID โ€” ํ™œ์„ฑ ํ”„๋กœ์ ํŠธ id.
  • OD_PROJECT_DIR โ€” ํ™œ์„ฑ ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ ๋””๋ ‰ํ„ฐ๋ฆฌ.

๋ฏธ๋””์–ด ์ƒ์„ฑ์ด OD_BIN: parameter not set, apps/daemon/dist/cli.js ๋ˆ„๋ฝ, failed to reach daemon at http://127.0.0.1:0 ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋กœ ์‹คํŒจํ•˜๋ฉด, daemon CLI๋ฅผ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๊ณ  ๊ด€๋ฆฌ ์ค‘์ธ ๋Ÿฐํƒ€์ž„์„ ์žฌ์‹œ์ž‘ํ•˜์„ธ์š”.

pnpm --filter @open-design/daemon build
pnpm tools-dev restart --daemon-port 7457 --web-port 5175
ls -la apps/daemon/dist/cli.js
curl -s http://127.0.0.1:7457/api/health

๊ทธ๋‹ค์Œ ์˜ค๋ž˜๋œ ํ„ฐ๋ฏธ๋„ ์—์ด์ „ํŠธ ์„ธ์…˜์„ ์ด์–ด ๊ฐ€์ง€ ๋ง๊ณ , Open Design ์•ฑ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ์—ฌ์„ธ์š”. daemon์ด spawnํ•œ ์—์ด์ „ํŠธ๋ผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ’์ด ๋ณด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

echo "OD_BIN=$OD_BIN"
echo "OD_PROJECT_ID=$OD_PROJECT_ID"
echo "OD_PROJECT_DIR=$OD_PROJECT_DIR"
echo "OD_DAEMON_URL=$OD_DAEMON_URL"
ls -la "$OD_BIN"

OD_DAEMON_URL์€ http://127.0.0.1:7457์ฒ˜๋Ÿผ ์‹ค์ œ daemon ํฌํŠธ์—ฌ์•ผ ํ•˜๋ฉฐ, http://127.0.0.1:0์ด์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. :0 ๊ฐ’์€ "๋นˆ ํฌํŠธ๋ฅผ ๊ณจ๋ผ๋ผ"๋ผ๋Š” ๋‚ด๋ถ€ ์‹คํ–‰ ํžŒํŠธ์ผ ๋ฟ์ด๋ผ, ์—์ด์ „ํŠธ ์„ธ์…˜์œผ๋กœ ์ƒˆ์–ด ๋‚˜๊ฐ€๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

daemon ๋‹จ๋… ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ๋Š” daemon์ด ์ •์  Next.js export๋ฅผ http://localhost:7456์—์„œ ์ง์ ‘ ์„œ๋น™ํ•˜๋ฏ€๋กœ, reverse proxy๊ฐ€ ๋ผ์–ด๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

daemon ์•ž์— nginx๋ฅผ ๋‘”๋‹ค๋ฉด, SSE ๊ฒฝ๋กœ๋Š” ๋ฒ„ํผ๋ง๊ณผ ์••์ถ•์„ ๋„์„ธ์š”. ํ”ํ•œ ์‹คํŒจ๋Š” 80~90์ดˆ ๋’ค ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์— net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)๊ฐ€ ๋œจ๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. daemon์ด X-Accel-Buffering: no๋ฅผ ๋ณด๋‚ด๋„ nginx์˜ gzip on์ด ์ฒญํฌ SSE ์‘๋‹ต์„ ๋ฒ„ํผ๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

location /api/ {
    proxy_pass http://127.0.0.1:7456;

    proxy_buffering off;
    gzip off;

    proxy_read_timeout 86400s;
    proxy_send_timeout 86400s;
    proxy_http_version 1.1;
    proxy_set_header Connection "";

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

๋‘ ๊ฐ€์ง€ ์‹คํ–‰ ๋ชจ๋“œ

๋ชจ๋“œ ์„ ํƒ๊ฐ’ ์š”์ฒญ์ด ํ๋ฅด๋Š” ๊ฒฝ๋กœ
Local CLI (daemon์ด ์—์ด์ „ํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’) "Local CLI" ํ”„๋ก ํŠธ์—”๋“œ โ†’ daemon /api/chat โ†’ spawn(<agent>, ...) โ†’ ๊ตฌ์กฐํ™”๋œ ๋„๊ตฌ/ํŒŒ์ผ ์ด๋ฒคํŠธ๋ฅผ SSE๋กœ ์ „๋‹ฌ โ†’ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ โ†’ ๋ฏธ๋ฆฌ๋ณด๊ธฐ. plain-stream CLI๋Š” text-artifact ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
API ๋ชจ๋“œ (๋Œ€์ฒด ์ˆ˜๋‹จ / CLI ์—†์Œ) "Anthropic API" / "OpenAI API" / "Atlas Cloud" / "Azure OpenAI" / "Google Gemini" ํ”„๋ก ํŠธ์—”๋“œ โ†’ daemon /api/proxy/{provider}/stream โ†’ ํ”„๋กœ๋ฐ”์ด๋” SSE๋ฅผ delta/end/error๋กœ ์ •๊ทœํ™” โ†’ <artifact> ํŒŒ์„œ โ†’ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

๋‘ ๋ชจ๋“œ ๋ชจ๋‘ ๊ฐ™์€ ํŒŒ์ผ ์ž‘์—… ๊ณต๊ฐ„๊ณผ ์ƒŒ๋“œ๋ฐ•์Šค ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— ๋„๋‹ฌํ•˜์ง€๋งŒ ์ธ๊ณ„ ๊ณ„์•ฝ์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„์€ ์ •์‹ ํŒŒ์ผ์„ ์“ฐ๋ฉฐ ์†Œ์Šค๋ฅผ <artifact>๋กœ ๋˜ํ’€์ดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. plain/ํ…์ŠคํŠธ ์ „์šฉ ๋ฐ BYOK ์‹คํ–‰์—๋Š” ํŒŒ์ผ ๋„๊ตฌ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์™„์ „ํ•œ HTML์„ ๋‹ด์€ <artifact>๊ฐ€ ์ •์‹ ๊ฒฐ๊ณผ๋ฌผ์ž…๋‹ˆ๋‹ค. ์‹คํ–‰ ํ”„๋กœํ•„์€ ๋Ÿฐํƒ€์ž„ ์ „์†ก ๋ฐฉ์‹์—์„œ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กฌํ”„ํŠธ ๊ตฌ์„ฑ

์ „์†กํ•  ๋•Œ๋งˆ๋‹ค ์•ฑ์€ ์„ธ ๊ฐœ์˜ ๋ ˆ์ด์–ด๋กœ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ํ”„๋กœ๋ฐ”์ด๋”์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.

BASE_SYSTEM_PROMPT   (์‹คํ–‰ ํ”„๋กœํ•„๋ณ„ ํŒŒ์ผ ๋˜๋Š” <artifact> ์ธ๊ณ„)
   + ํ™œ์„ฑ ๋””์ž์ธ ์‹œ์Šคํ…œ ๋ณธ๋ฌธ  (DESIGN.md โ€” ํŒ”๋ ˆํŠธ/ํƒ€์ž…/๋ ˆ์ด์•„์›ƒ)
   + ํ™œ์„ฑ skill ๋ณธ๋ฌธ          (SKILL.md โ€” ์›Œํฌํ”Œ๋กœ์šฐ์™€ ์ถœ๋ ฅ ๊ทœ์น™)

์ƒ๋‹จ ๋ฐ”์—์„œ skill์ด๋‚˜ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ๋ฐ”๊พธ๋ฉด, ๋‹ค์Œ ์ „์†ก๋ถ€ํ„ฐ ์ƒˆ ์กฐํ•ฉ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์€ ์„ธ์…˜๋ณ„๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹œ๋˜๋ฏ€๋กœ, ํ•œ ๋ฒˆ ์„ ํƒํ•  ๋•Œ daemon์— ํ•œ ๋ฒˆ๋งŒ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ๋งต

open-design/
โ”œโ”€โ”€ apps/
โ”‚   โ”œโ”€โ”€ daemon/                # Node/Express โ€” ๋กœ์ปฌ ์—์ด์ „ํŠธ spawn + API ์„œ๋น™
โ”‚   โ”‚   โ””โ”€โ”€ src/
โ”‚   โ”‚       โ”œโ”€โ”€ cli.ts             # `od` bin ์ง„์ž…์ 
โ”‚   โ”‚       โ”œโ”€โ”€ server.ts          # /api/* + ์ •์  ์„œ๋น™
โ”‚   โ”‚       โ”œโ”€โ”€ agents.ts          # ๋Ÿฐํƒ€์ž„ ๋ชจ๋“ˆ ํ˜ธํ™˜์„ฑ export
โ”‚   โ”‚       โ”œโ”€โ”€ runtimes/
โ”‚   โ”‚       โ”‚   โ”œโ”€โ”€ registry.ts    # ์ง€์› ๋Ÿฐํƒ€์ž„ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ
โ”‚   โ”‚       โ”‚   โ””โ”€โ”€ defs/          # ๋Ÿฐํƒ€์ž„๋ณ„ ์‹คํ–‰ ๋ฐ ์ธ์ž ์ •์˜
โ”‚   โ”‚       โ”œโ”€โ”€ skills.ts          # SKILL.md ๋กœ๋” (frontmatter ํŒŒ์„œ)
โ”‚   โ”‚       โ””โ”€โ”€ design-systems/    # DESIGN.md ๋กœ๋” ๋ฐ ์„œ๋น„์Šค
โ”‚   โ”‚   โ”œโ”€โ”€ sidecar/           # tools-dev daemon sidecar ๋ž˜ํผ
โ”‚   โ”‚   โ””โ”€โ”€ tests/             # daemon ํŒจํ‚ค์ง€ ํ…Œ์ŠคํŠธ
โ”‚   โ”œโ”€โ”€ web/                   # Next.js 16 App Router + React ํด๋ผ์ด์–ธํŠธ
โ”‚       โ”œโ”€โ”€ app/               # App Router ์ง„์ž…์ 
โ”‚       โ”œโ”€โ”€ src/               # React + TypeScript ํด๋ผ์ด์–ธํŠธ/๋Ÿฐํƒ€์ž„ ๋ชจ๋“ˆ
โ”‚       โ”‚   โ”œโ”€โ”€ App.tsx        # ๋ชจ๋“œ / skill / DS ์„ ํƒ๊ธฐ + ์ „์†ก ์กฐ์œจ
โ”‚       โ”‚   โ”œโ”€โ”€ providers/     # daemon + BYOK API ์ „์†ก ๊ณ„์ธต
โ”‚       โ”‚   โ”œโ”€โ”€ prompts/       # system, discovery, directions, deck framework
โ”‚       โ”‚   โ”œโ”€โ”€ artifacts/     # text-artifact ํŒŒ์‹ฑ + artifact manifest
โ”‚       โ”‚   โ”œโ”€โ”€ runtime/       # iframe srcdoc, markdown, export ํ—ฌํผ
โ”‚       โ”‚   โ””โ”€โ”€ state/         # localStorage + daemon ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ ์ƒํƒœ
โ”‚       โ”œโ”€โ”€ sidecar/           # tools-dev web sidecar ๋ž˜ํผ
โ”‚       โ””โ”€โ”€ next.config.ts     # tools-dev rewrite + prod apps/web/out export ์„ค์ •
โ”‚   โ””โ”€โ”€ desktop/               # tools-dev๊ฐ€ ์‹คํ–‰/์ ๊ฒ€ํ•˜๋Š” Electron ๋Ÿฐํƒ€์ž„
โ”œโ”€โ”€ packages/
โ”‚   โ”œโ”€โ”€ contracts/             # ๊ณต์œ  web/daemon ์•ฑ contract
โ”‚   โ”œโ”€โ”€ sidecar-proto/         # Open Design sidecar ํ”„๋กœํ† ์ฝœ contract
โ”‚   โ”œโ”€โ”€ sidecar/               # ๋ฒ”์šฉ sidecar ๋Ÿฐํƒ€์ž„ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ
โ”‚   โ””โ”€โ”€ platform/              # ๋ฒ”์šฉ process/platform ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ
โ”œโ”€โ”€ tools/dev/                 # `pnpm tools-dev` ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฐ inspect CLI
โ”œโ”€โ”€ e2e/                       # Playwright UI + ์™ธ๋ถ€ ํ†ตํ•ฉ/Vitest ํ•˜๋„ค์Šค
โ”œโ”€โ”€ skills/                    # ์ž‘์—… ์ค‘ ํ˜ธ์ถœํ•˜๋Š” ๊ธฐ๋Šฅ์  ์—ญ๋Ÿ‰
โ”œโ”€โ”€ design-templates/          # ํ”„๋กœํ† ํƒ€์ž…, deck, ๋ฌธ์„œ, ๋ฏธ๋””์–ด ๋ Œ๋”๋ง ์นดํƒˆ๋กœ๊ทธ
โ”œโ”€โ”€ design-systems/            # DESIGN.md๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ํ•œ ๋ธŒ๋žœ๋“œ ํŒจํ‚ค์ง€
โ”œโ”€โ”€ scripts/sync-design-systems.ts    # ์—…์ŠคํŠธ๋ฆผ getdesign tarball์—์„œ ๋‹ค์‹œ import
โ”œโ”€โ”€ docs/                      # ์ œํ’ˆ ๋น„์ „ + ์ŠคํŽ™
โ”œโ”€โ”€ pnpm-workspace.yaml        # apps/* + packages/* + tools/* + e2e
โ””โ”€โ”€ package.json               # ๋ฃจํŠธ ํ’ˆ์งˆ ์Šคํฌ๋ฆฝํŠธ + `od` bin

๋ฌธ์ œ ํ•ด๊ฒฐ

  • Node.js ๋ฒ„์ „์„ ๋ฐ”๊พผ ๋’ค better-sqlite3๊ฐ€ ๋กœ๋“œ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ABI๊ฐ€ ๋งž์ง€ ์•Š์„ ๋•Œ โ€” pnpm install์ด postinstall์„ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋Œ๋ ค ํ˜„์žฌ Node.js์— ๋งž๊ฒŒ ๋„ค์ดํ‹ฐ๋ธŒ ์• ๋“œ์˜จ์„ ๋ฆฌ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ง์ ‘ ๋ฆฌ๋นŒ๋“œํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •์„ ํ™•์ธํ•˜๋ ค๋ฉด pnpm --filter @open-design/daemon rebuild better-sqlite3๋ฅผ ์‹คํ–‰ํ•œ ๋’ค pnpm --filter @open-design/daemon exec node -e "require('better-sqlite3')"๋ฅผ ๋Œ๋ฆฌ์„ธ์š”. ๋นŒ๋“œ ๋„๊ตฌ python3, make, g++(๋˜๋Š” clang++)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. .npmrc์— ignore-scripts=true๊ฐ€ ์žˆ๋‹ค๋ฉด(AUR ํŒจํ‚ค์ง€์˜ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ), pnpm install ํ›„ pnpm bootstrap์„ ์‹คํ–‰ํ•˜์„ธ์š”.
  • "no agents found on PATH" โ€” apps/daemon/src/runtimes/registry.ts์— ๋“ฑ๋ก๋œ ๋กœ์ปฌ ๋Ÿฐํƒ€์ž„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ ํŒŒ์ผ์ด daemon์— ๋ณด์ด๋Š”์ง€ ํ™•์ธํ•œ ๋’ค, Settings โ†’ Execution mode์—์„œ Rescan์„ ์‹คํ–‰ํ•˜์„ธ์š”. ๋˜๋Š” Settings์—์„œ BYOK ๋Ÿฐํƒ€์ž„์„ ๊ตฌ์„ฑํ•˜์„ธ์š”.
  • Claude Code๊ฐ€ ์ฝ”๋“œ 1๋กœ ์ข…๋ฃŒ๋  ๋•Œ โ€” Open Design์ด claude๋ฅผ ์‹œ์ž‘ํ•˜๊ธด ํ–ˆ์ง€๋งŒ, spawn๋œ ๋น„๋Œ€ํ™”ํ˜• ์‹คํ–‰์ด ์‘๋‹ต์„ ๋‚ด๊ธฐ ์ „์— ์‹คํŒจํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. Open Design์„ ์‹œ์ž‘ํ•˜๋Š” ์…ธ์ด๋‚˜ ์•ฑ ํ™˜๊ฒฝ๊ณผ ๊ฐ™์€ ๊ณณ์—์„œ ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”.
    claude --version
    claude auth status --text
    printf 'hello' | claude -p --output-format stream-json --verbose --permission-mode bypassPermissions
    ์Šค๋ชจํฌ ํ…Œ์ŠคํŠธ๊ฐ€ ์ปค์Šคํ…€ ์—”๋“œํฌ์ธํŠธ ์—†์ด 401, apiKeySource: "none", ๋˜๋Š” ๋‹ค๋ฅธ ์ธ์ฆ ์˜ค๋ฅ˜๋ฅผ ๋‚ธ๋‹ค๋ฉด, claude๋ฅผ ์‹คํ–‰ํ•ด /loginํ•œ ๋’ค Claude๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  Open Design์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”. Claude ํ”„๋กœํ•„์„ ์—ฌ๋Ÿฌ ๊ฐœ ์“ด๋‹ค๋ฉด Settings -> Execution mode -> Claude Code config directory๋ฅผ ~/.claude-2 ๊ฐ™์€ ํ”„๋กœํ•„ ๊ฒฝ๋กœ๋กœ ์ง€์ •ํ•˜์„ธ์š”. ANTHROPIC_BASE_URL์ด๋‚˜ ํ”„๋ก์‹œ๊ฐ€ ์„ค์ •๋ผ ์žˆ๋‹ค๋ฉด ์—”๋“œํฌ์ธํŠธ URL, ํ”„๋ก์‹œ ์ž๊ฒฉ ์ฆ๋ช…, ์—”๋“œํฌ์ธํŠธ ์ธ์ฆ ํ™˜๊ฒฝ, ๋ชจ๋ธ ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ™•์ธํ•˜์„ธ์š”. ํ‘œ์ค€ Claude Code ์ธ์ฆ์œผ๋กœ ๋‹ค์‹œ ์‹œ๋„ํ•˜๋ ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์ปค์Šคํ…€ ์—”๋“œํฌ์ธํŠธ๋Š” ๊ทธ๋Œ€๋กœ ๋‘์„ธ์š”. Windows์—์„œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ PowerShell๊ณผ WSL์ด ์„œ๋กœ ๋‹ค๋ฅธ Claude ์„ค์น˜๋ณธ๊ณผ ์ž๊ฒฉ ์ฆ๋ช… ์ €์žฅ์†Œ๋ฅผ ์“ฐ๋ฏ€๋กœ, Open Design์ด ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ๋‹ค์‹œ ์ธ์ฆํ•˜๊ณ , /login์œผ๋กœ๋„ ๋„ค์ดํ‹ฐ๋ธŒ Windows ์ž๊ฒฉ ์ฆ๋ช…์ด ๋ณต๊ตฌ๋˜์ง€ ์•Š์œผ๋ฉด Windows ์ž๊ฒฉ ์ฆ๋ช… ๊ด€๋ฆฌ์ž๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  • /api/chat์—์„œ daemon 500 โ€” daemon ํ„ฐ๋ฏธ๋„์˜ stderr ๋๋ถ€๋ถ„์„ ํ™•์ธํ•˜์„ธ์š”. ๋Œ€๊ฐœ CLI๊ฐ€ ์ž์‹ ์˜ ์ธ์ž๋ฅผ ๊ฑฐ๋ถ€ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. CLI๋งˆ๋‹ค ๋ฐ›๋Š” argv ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์†๋ด์•ผ ํ•œ๋‹ค๋ฉด apps/daemon/src/runtimes/defs/์˜ ํ•ด๋‹น ์ •์˜๋ฅผ ๋ณด์„ธ์š”.
  • ๋ฏธ๋””์–ด ์ƒ์„ฑ์ด OD_BIN ๋ˆ„๋ฝ ๋˜๋Š” daemon URL์ด :0์ด๋ผ๊ณ  ํ•  ๋•Œ โ€” ์œ„์˜ ๋ฏธ๋””์–ด dispatcher ์ ๊ฒ€์„ ์‹คํ–‰ํ•˜์„ธ์š”. ์˜› CLI ์„ธ์…˜์„ ์ด์–ด ๊ฐ€์ง€ ๋ง๊ณ , Open Design ์•ฑ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์‹œ ์—ด์–ด daemon์ด ์ƒˆ OD_* ๋ณ€์ˆ˜๋ฅผ ์ฃผ์ž…ํ•˜๊ฒŒ ํ•˜์„ธ์š”.
  • Codex๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ปจํ…์ŠคํŠธ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ๋กœ๋“œํ•  ๋•Œ โ€” OD_CODEX_DISABLE_PLUGINS=1 pnpm tools-dev๋กœ Open Design์„ ์‹œ์ž‘ํ•˜๋ฉด, daemon์ด spawnํ•˜๋Š” Codex ํ”„๋กœ์„ธ์Šค๊ฐ€ --disable plugins๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  • artifact๊ฐ€ ๋๋‚ด ๋ Œ๋”๋ง๋˜์ง€ ์•Š์„ ๋•Œ โ€” ๋จผ์ € ์‹คํ–‰์˜ ์ธ๊ณ„ ํ”„๋กœํ•„์„ ํ™•์ธํ•˜์„ธ์š”. ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ์“ฐ๋Š” ๋กœ์ปฌ ๋Ÿฐํƒ€์ž„์€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๋Š”์ง€, ํŒŒ์ผ ์ด๋ฒคํŠธ๊ฐ€ daemon์— ๋„์ฐฉํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ฉฐ ์†Œ์Šค๋ฅผ <artifact>์— ๋„ฃ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. plain/ํ…์ŠคํŠธ ์ „์šฉ ๋˜๋Š” BYOK ์‹คํ–‰์€ ์™„์ „ํ•œ <artifact> ๋ธ”๋ก ํ•˜๋‚˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  daemon ๋กœ๊ทธ์—์„œ ์ฒ˜์Œ ์‹คํŒจํ•œ ๊ฒฝ๊ณ„๋ฅผ ์ฐพ์œผ์„ธ์š”.

๋น„์ „๊ณผ ๋‹ค์‹œ ์ž‡๊ธฐ

์ด ๋น ๋ฅธ ์‹œ์ž‘์€ docs/์— ๋‹ด๊ธด ์ŠคํŽ™์„ ์‹ค์ œ๋กœ ๋Œ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ์”จ์•—์ž…๋‹ˆ๋‹ค. ์ŠคํŽ™์€ ์ด๊ฒƒ์ด ์–ด๋””๋กœ ์ž๋ผ๋‚ ์ง€ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค(docs/roadmap.md ์ฐธ๊ณ ). ํ•ต์‹ฌ๋งŒ ์งš์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • docs/architecture.md๋Š” ์ถœ์‹œ๋œ ์Šคํƒ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์•ž๋‹จ์˜ Next.js 16 App Router, ๊ทธ ๋’ค์˜ ๋กœ์ปฌ daemon, ๊ทธ๋ฆฌ๊ณ  dev์—์„œ apps/web/next.config.ts์˜ rewrite๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฐ™์€ /api ํ‘œ๋ฉด๊ณผ ๊ณ„์† ํ†ต์‹ ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
  • docs/skills-protocol.md๋Š” ํ˜„์žฌ SKILL.md/od: frontmatter์™€ ๊ธฐ๋Šฅ skillยท๋ Œ๋”๋ง ํ…œํ”Œ๋ฆฟ์˜ ๋ถ„๋ฆฌ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์„œ์™€ ์ •๊ทœํ™”์˜ ๊ตฌํ˜„ ๊ธฐ์ค€์€ apps/daemon/src/skills.ts์ž…๋‹ˆ๋‹ค.
  • docs/agent-adapters.md๋Š” ์–ด๋Œ‘ํ„ฐ ๊ณ„์•ฝ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„๋ณ„ ์‹คํ–‰, ์ธ์ž, ๋ชจ๋ธ, ์ŠคํŠธ๋ฆผ ์„ค์ •์€ apps/daemon/src/runtimes/defs/์— ์žˆ๊ณ  apps/daemon/src/runtimes/registry.ts์—์„œ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. apps/daemon/src/agents.ts๋Š” ํ˜ธํ™˜์„ฑ export ํ‘œ๋ฉด์ž…๋‹ˆ๋‹ค.
  • docs/modes.md๋Š” 6๊ฐœ์˜ New Project ํƒญ๊ณผ 7๊ฐœ์˜ ์ •๊ทœํ™”๋œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋ชจ๋“œ(prototype, deck, template, design-system, image, video, audio)๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.