Skip to content

Latest commit

ย 

History

History
371 lines (271 loc) ยท 21.5 KB

File metadata and controls

371 lines (271 loc) ยท 21.5 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: Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen, Qoder CLI, GitHub Copilot CLI ๋“ฑ. ์„ค์น˜๋œ CLI๊ฐ€ ์—†์œผ๋ฉด Settings์—์„œ BYOK API ๋ชจ๋“œ๋ฅผ ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ์—์ด์ „ํŠธ 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์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค

์ฒ˜์Œ ๋กœ๋“œํ•  ๋•Œ ์•ฑ์€ ์„ค์น˜๋œ ์ฝ”๋“œ ์—์ด์ „ํŠธ CLI(Claude Code / Codex / Gemini / OpenCode / Cursor Agent / Qwen)๋ฅผ ๊ฐ์ง€ํ•ด ์ž๋™์œผ๋กœ ์„ ํƒํ•˜๊ณ , ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ web-prototype skill๊ณผ Neutral Modern design system์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  Send๋ฅผ ๋ˆ„๋ฅด์„ธ์š”. ์—์ด์ „ํŠธ ์ถœ๋ ฅ์€ ์™ผ์ชฝ ํŒจ๋„์— ์ŠคํŠธ๋ฆฌ๋ฐ๋˜๊ณ , <artifact> ํƒœ๊ทธ๊ฐ€ ํŒŒ์‹ฑ๋˜์–ด HTML์ด ์˜ค๋ฅธ์ชฝ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ๋˜๋ฉด Save to disk๋กœ artifact๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. artifact ์ €์žฅ ๊ฒฝ๋กœ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ ๋ฃจํŠธ AGENTS.md์˜ Daemon data directory contract๋ฅผ ์ฝ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Design system ๋“œ๋กญ๋‹ค์šด์—๋Š” 71๊ฐœ์˜ ๋‚ด์žฅ ์‹œ์Šคํ…œ์ด ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ง์ ‘ ์ž‘์„ฑํ•œ ์Šคํƒ€ํ„ฐ 2๊ฐœ(Neutral Modern, Warm Editorial)์™€ awesome-design-md์—์„œ ๊ฐ€์ ธ์˜จ 69๊ฐœ์˜ ์ œํ’ˆ ์‹œ์Šคํ…œ์œผ๋กœ, ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„(AI & LLM, Developer Tools, Productivity, Backend, Design Tools, Fintech, E-Commerce, Media, Automotive)๋กœ ๋ฌถ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฅด๋ฉด ๋ชจ๋“  ํ”„๋กœํ† ํƒ€์ž…์ด ๊ทธ ๋ธŒ๋žœ๋“œ์˜ ๋ฏธ๊ฐ์œผ๋กœ ์ž…ํ˜€์ง‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— awesome-design-skills์—์„œ ๊ฐ€์ ธ์˜จ 57๊ฐœ์˜ ๋””์ž์ธ skill๋„ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

Skill ๋“œ๋กญ๋‹ค์šด์€ ๋ชจ๋“œ๋ณ„(Prototype / Deck / Template / Design system)๋กœ ๋ฌถ์ด๋ฉฐ, ๊ฐ ๋ชจ๋“œ์˜ ๊ธฐ๋ณธ skill์—๋Š” ยท default ์ ‘๋ฏธ์‚ฌ๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค. ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” skill์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Prototype โ€” web-prototype(๋ฒ”์šฉ), saas-landing, dashboard, pricing-page, docs-page, blog-post, mobile-app.
  • Deck / PPT โ€” simple-deck(๋‹จ์ผ ํŒŒ์ผ ๊ฐ€๋กœ ์Šค์™€์ดํ”„)๊ณผ magazine-web-ppt(op7418/guizang-ppt-skill์—์„œ ๊ฐ€์ ธ์˜จ guizang-ppt ๋ฒˆ๋“ค. deck ๋ชจ๋“œ์˜ ๊ธฐ๋ณธ๊ฐ’์ด๋ฉฐ, ์ž์ฒด ์—์…‹/ํ…œํ”Œ๋ฆฟ๊ณผ ๋ ˆํผ๋Ÿฐ์Šค 4๊ฐœ๋ฅผ ํ•จ๊ป˜ ์ œ๊ณต). ์‚ฌ์ด๋“œ ํŒŒ์ผ์ด ์žˆ๋Š” skill์—๋Š” "Skill root (absolute)" ๋จธ๋ฆฌ๋ง์ด ์ž๋™์œผ๋กœ ๋ถ™์–ด, ์—์ด์ „ํŠธ๊ฐ€ assets/template.html์ด๋‚˜ references/*.md๋ฅผ CWD๊ฐ€ ์•„๋‹ˆ๋ผ ์‹ค์ œ ๋””์Šคํฌ ๊ฒฝ๋กœ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

skill๊ณผ ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์ง์ง€์œผ๋ฉด, ํ”„๋กฌํ”„ํŠธ ํ•˜๋‚˜๋กœ ์„ ํƒํ•œ ์‹œ๊ฐ ์–ธ์–ด์— ๋งž๋Š” ํ”„๋กœํ† ํƒ€์ž…์ด๋‚˜ deck์ด ๋ ˆ์ด์•„์›ƒ์— ๋งž๊ฒŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

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

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>, ...) โ†’ stdout โ†’ SSE โ†’ artifact ํŒŒ์„œ โ†’ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
API ๋ชจ๋“œ (๋Œ€์ฒด ์ˆ˜๋‹จ / CLI ์—†์Œ) "Anthropic API" / "OpenAI API" / "Azure OpenAI" / "Google Gemini" ํ”„๋ก ํŠธ์—”๋“œ โ†’ daemon /api/proxy/{provider}/stream โ†’ ํ”„๋กœ๋ฐ”์ด๋” SSE๋ฅผ delta/end/error๋กœ ์ •๊ทœํ™” โ†’ artifact ํŒŒ์„œ โ†’ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

๋‘ ๋ชจ๋“œ ๋ชจ๋‘ ๊ฐ™์€ <artifact> ํŒŒ์„œ์™€ ๊ฐ™์€ ์ƒŒ๋“œ๋ฐ•์Šค iframe์œผ๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ ์€ ์ „์†ก ๋ฐฉ์‹๊ณผ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ์ „๋‹ฌ ๋ฐฉ์‹๋ฟ์ž…๋‹ˆ๋‹ค(๋กœ์ปฌ CLI๋Š” ๋ณ„๋„์˜ ์‹œ์Šคํ…œ ์ฑ„๋„์ด ์—†์–ด์„œ, ์กฐํ•ฉ๋œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ ์•ˆ์— ์ ‘์–ด ๋„ฃ์Šต๋‹ˆ๋‹ค).

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

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

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          # claude/codex/devin/gemini/opencode/cursor-agent/qwen/qoder/copilot์šฉ PATH ์Šค์บ๋„ˆ
โ”‚   โ”‚       โ”œโ”€โ”€ skills.ts          # SKILL.md ๋กœ๋” (frontmatter ํŒŒ์„œ)
โ”‚   โ”‚       โ””โ”€โ”€ design-systems.ts  # 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/     # ์ŠคํŠธ๋ฆฌ๋ฐ <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/                    # SKILL.md โ€” ์–ด๋–ค Claude Code skill ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ๋“  ๊ทธ๋Œ€๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ
โ”‚   โ”œโ”€โ”€ web-prototype/         # ๋ฒ”์šฉ ๋‹จ์ผ ํ™”๋ฉด ํ”„๋กœํ† ํƒ€์ž… (prototype ๋ชจ๋“œ ๊ธฐ๋ณธ๊ฐ’)
โ”‚   โ”œโ”€โ”€ saas-landing/          # ๋งˆ์ผ€ํŒ… ํŽ˜์ด์ง€ (hero / features / pricing / CTA)
โ”‚   โ”œโ”€โ”€ dashboard/             # ๊ด€๋ฆฌ์ž / ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ
โ”‚   โ”œโ”€โ”€ pricing-page/          # ๋‹จ๋… ๊ฐ€๊ฒฉ + ๋น„๊ต
โ”‚   โ”œโ”€โ”€ docs-page/             # 3๋‹จ ๋ฌธ์„œ ๋ ˆ์ด์•„์›ƒ
โ”‚   โ”œโ”€โ”€ blog-post/             # ์—๋””ํ† ๋ฆฌ์–ผ ๋กฑํผ
โ”‚   โ”œโ”€โ”€ mobile-app/            # ํœด๋Œ€ํฐ ํ”„๋ ˆ์ž„ ๋‹จ์ผ ํ™”๋ฉด
โ”‚   โ”œโ”€โ”€ simple-deck/           # ๋ฏธ๋‹ˆ๋ฉ€ ๊ฐ€๋กœ ์Šค์™€์ดํ”„ deck
โ”‚   โ””โ”€โ”€ guizang-ppt/           # magazine-web-ppt โ€” ๋ฒˆ๋“ค๋œ deck/PPT ๊ธฐ๋ณธ๊ฐ’
โ”‚       โ”œโ”€โ”€ SKILL.md
โ”‚       โ”œโ”€โ”€ assets/template.html
โ”‚       โ””โ”€โ”€ references/{themes,layouts,components,checklist}.md
โ”œโ”€โ”€ design-systems/            # DESIGN.md โ€” 9๊ฐœ ์„น์…˜ ์Šคํ‚ค๋งˆ (awesome-claude-design)
โ”‚   โ”œโ”€โ”€ default/               # Neutral Modern (์Šคํƒ€ํ„ฐ)
โ”‚   โ”œโ”€โ”€ warm-editorial/        # Warm Editorial (์Šคํƒ€ํ„ฐ)
โ”‚   โ”œโ”€โ”€ README.md              # ์นดํƒˆ๋กœ๊ทธ ๊ฐœ์š”
โ”‚   โ””โ”€โ”€ โ€ฆ129๊ฐœ ์‹œ์Šคํ…œ          # ์Šคํƒ€ํ„ฐ 2๊ฐœ ยท ์ œํ’ˆ ์‹œ์Šคํ…œ 70๊ฐœ ยท ๋””์ž์ธ skill 57๊ฐœ
โ”œโ”€โ”€ 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๊ฐ€ ์žˆ๋‹ค๋ฉด, pnpm install ํ›„ node scripts/postinstall.mjs๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.
  • "no agents found on PATH" โ€” claude, codex, devin, gemini, opencode, cursor-agent, qwen, qodercli, copilot ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ค์น˜ํ•˜์„ธ์š”. ์•„๋‹ˆ๋ฉด Settings์—์„œ API ๋ชจ๋“œ๋กœ ๋ฐ”๊พธ๊ณ  ํ”„๋กœ๋ฐ”์ด๋” ํ‚ค๋ฅผ ๋ถ™์—ฌ ๋„ฃ์œผ์„ธ์š”.
  • 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/agents.ts์˜ buildArgs๋ฅผ ๋ณด์„ธ์š”.
  • ๋ฏธ๋””์–ด ์ƒ์„ฑ์ด 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๊ฐ€ ๋๋‚ด ๋ Œ๋”๋ง๋˜์ง€ ์•Š์„ ๋•Œ โ€” ๋ชจ๋ธ์ด <artifact>๋กœ ๊ฐ์‹ธ์ง€ ์•Š์€ ํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“  ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ์ „๋‹ฌ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ (daemon ๋กœ๊ทธ ํ™•์ธ), ๋” ๊ฐ•๋ ฅํ•œ ๋ชจ๋ธ์ด๋‚˜ ๋” ์—„๊ฒฉํ•œ skill๋กœ ๋ฐ”๊ฟ” ๋ณด์„ธ์š”.

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

์ด ๋น ๋ฅธ ์‹œ์ž‘์€ 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๋Š” od: frontmatter ์ „์ฒด(ํƒ€์ž… ์ž…๋ ฅ, ์Šฌ๋ผ์ด๋”, ๊ธฐ๋Šฅ ๊ฒŒ์ดํŒ…)๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด MVP๋Š” name / description / triggers / od.mode / od.design_system.requires๋งŒ ์ฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด apps/daemon/src/skills.ts๋ฅผ ํ™•์žฅํ•˜์„ธ์š”.
  • docs/agent-adapters.md๋Š” ๋” ํ’๋ถ€ํ•œ dispatch(๊ธฐ๋Šฅ ๊ฐ์ง€, ์ŠคํŠธ๋ฆฌ๋ฐ tool-call)๋ฅผ ๋‚ด๋‹ค๋ด…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ apps/daemon/src/agents.ts๋Š” ๋ฐฐ์„ ์„ ์ฆ๋ช…ํ•  ๋งŒํผ๋งŒ ๊ฐ–์ถ˜ ์ตœ์†Œ dispatcher์ž…๋‹ˆ๋‹ค.
  • docs/modes.md๋Š” ๋„ค ๊ฐ€์ง€ ๋ชจ๋“œ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. prototype / deck / template / design-system. ์šฐ๋ฆฌ๋Š” ์•ž์˜ ๋‘ ๊ฐ€์ง€๋ฅผ ์œ„ํ•œ skill์„ ์ œ๊ณตํ•˜๋ฉฐ, ์„ ํƒ๊ธฐ๋Š” ์ด๋ฏธ mode๋กœ ํ•„ํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค.