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 ๋ฐํ์์ ์ฐ๋ฉด ๋ฉ๋๋ค.
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๊ฐ ์ถ๋ ฅ๋์ด์ผ ํฉ๋๋คNode.js๋ pnpm์ ๋ก์ปฌ์ ์ค์นํ์ง ์๊ณ ๋, ์์ ํ ์ปจํ ์ด๋ํ๋ ํ๊ฒฝ์์ Open Design์ ์คํํ ์ ์์ต๋๋ค.
- Docker Desktop
- Docker Compose v2
Docker๊ฐ ์ ๋๋ก ์ค์น๋๋์ง ํ์ธํ์ธ์.
docker compose version๋ฆฌํฌ์งํ ๋ฆฌ ๋ฃจํธ์์ ์งํํฉ๋๋ค.
-
deploy ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ ๋ค ํ๊ฒฝ ๋ณ์ ํ ํ๋ฆฟ์ ๋ณต์ฌํฉ๋๋ค.
cd deploy cp .env.example .env -
์์ ํ ํ ํฐ์ ์์ฑํฉ๋๋ค.
openssl rand -hex 32
-
์๋ํฐ์์
.env๋ฅผ ์ด๊ณOD_API_TOKEN=์ ์ฐพ์, ๋ฐฉ๊ธ ์์ฑํ ํ ํฐ์ ๋ถ์ฌ ๋ฃ์ต๋๋ค.
์ด์ ์๋น์ค๋ฅผ ์์ํฉ๋๋ค.
docker compose up -d๋ธ๋ผ์ฐ์ ์์ ์ฑ์ ์ฝ๋๋ค.
http://localhost:7456
์ฒ์ ์์ํ ๋๋ Docker๊ฐ ์ต์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ค๋๋ผ ๋ช ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค.
docker compose logs -fdocker compose restartdocker compose downdocker compose pull
docker compose up -ddocker compose down -v๊ธฐ๋ณธ ์ค์ ์ ๋ฎ์ด์ฐ๋ ค๋ฉด deploy/.env ํ์ผ์ ๋ง๋์ธ์. ์ ๊ณต๋ ์์์์ ์์ํ๋ฉด ๋ฉ๋๋ค.
cp deploy/.env.example deploy/.envdeploy/.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ํฌํธ์ ์ง์ ๋ ธ์ถํฉ๋๋ค. - ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ๋ ๊น์ ๋ก์ปฌ ์ค์ ์ ์ด ๋น ๋ฅธ ์์ ๊ฐ์ด๋์ ๋๋จธ์ง ๋ถ๋ถ์ ์ฐธ๊ณ ํ์ธ์.
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 ํ๋ก์ธ์ค์ ํต์ ํ ์ ์์ต๋๋ค.
์ด๋ฏธ์ง, ๋น๋์ค, ์ค๋์ค, 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)๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.