系列文章: Opendesign (5/11)

Open Design BYOK 與多 CLI 自動偵測:把你既有 agent 變成設計引擎
上一篇講到 Open Design 的第一條核心理念是「不自己出 agent」,這篇直接拆解這條理念在實作層怎麼運作——七個支援的 CLI、自動偵測的邏輯、BYOK fallback 的接法。看完這篇你會知道為什麼這個設計對使用者很划算。
Open Design 支援哪些 CLI
七個 first-party 支援、加 Anthropic API BYOK fallback:
| Agent | Bin 名稱 | Streaming | 備註 |
|---|---|---|---|
| Claude Code | claude |
typed events | 一級公民、fidelity 最高 |
| Codex CLI | codex |
line-buffered | codex exec |
| Cursor Agent | cursor-agent |
line-buffered | cursor-agent -p |
| Gemini CLI | gemini |
line-buffered | gemini -p |
| OpenCode | opencode |
line-buffered | opencode run |
| Qwen Code | qwen |
line-buffered | qwen -p |
| GitHub Copilot CLI | copilot |
typed events | copilot -p --allow-all-tools --output-format json |
| Anthropic API · BYOK | n/a | SSE 直連 | 上述都沒裝時的 fallback |
七個 agent 不是並列「亂選一個」——Claude Code 跟 Copilot 走的是 typed event streaming,其他五個是 line-buffered 純文字。差別在 UI 體驗。
Typed events vs. line-buffered 差在哪
這個技術細節值得知道,因為它決定你看到的 todo card 多即時。
typed events(Claude Code、Copilot CLI):CLI 本身吐 JSON 事件——tool_use_started、tool_use_completed、text_block、thinking,daemon 可以精確知道現在 agent 在做什麼。UI 上你會看到:
- 即時的 TodoWrite 狀態變化(pending → in_progress → completed)
- 每個 tool call 的進度
- thinking 區塊獨立呈現
line-buffered(其他五個):CLI 吐純文字,daemon 只能 buffer 整行、做啟發式 parse。UI 上你會看到完整輸出,但沒辦法做到那麼即時的細顆粒度狀態。
不影響輸出品質,只影響「看 agent 工作的爽度」。
Daemon 怎麼自動偵測
啟動瞬間 daemon 做的事其實很單純:
// 概念上的偽代碼,實際在 apps/daemon/src/agents.ts
const candidates = ['claude', 'codex', 'cursor-agent', 'gemini', 'opencode', 'qwen', 'copilot']
const found = candidates.filter(bin => which(bin))
const primary = found[0] ?? 'byok'PATH 上有什麼就用什麼,沒設定檔、沒環境變數、沒 wizard。同時裝多個 CLI 也行——daemon 會把全部能用的 agent 列出來,UI 上提供切換。
要新加一個 CLI?就是在 apps/daemon/src/agents.ts 加一個 entry:
{
name: 'kimi',
bin: 'kimi',
argv: (prompt) => ['-p', prompt],
streaming: 'plain', // 或 'claude-stream-json'
}一個 PR、十幾行程式碼。
BYOK fallback 模式
如果你機器上一個 CLI 都沒裝(公司鎖很死、或剛換新筆電還沒裝完),歡迎對話框會問你貼一把 Anthropic API key。貼上去之後:
- daemon 不再 spawn CLI
- 改走 Anthropic SDK 直接從瀏覽器發 SSE
- prompt stack 跟 skill / design system 注入完全一樣
- 唯一差別是 agent 沒有「真檔案系統」可以 read/write
可以用,但體驗有差——尤其是 brand-spec extraction 那條協議要 grep CSS 檔,沒檔案系統就只能用記憶體裡的內容做。建議是:有 CLI 就用 CLI,BYOK 是備胎不是主力。
為什麼這個設計對你很划算
換個角度看這六個理念裡最關鍵的「不出 agent」這條,使用者的帳這樣算:
- 你已經付過錢 — Claude Pro / Cursor Pro / Copilot Pro 月費已經在繳,再付一份「設計用的訂閱」是重複付費
- 你已經習慣那個 CLI — Claude Code 的指令、Cursor 的快捷鍵、Codex 的對話風格——學新工具的成本省下來
- 你的 model 升級不用等 — Anthropic 出新 model、OpenAI 出新 model,CLI 升級你就升級。不必等 Open Design 跟進
- 你的 enterprise 設定可以複用 — 公司的 proxy、SSO、key management 早就在 CLI 上設好,Open Design 直接吃這份配置
對比 Claude Design 綁 Anthropic 雲端、綁 Opus 4.7、綁訂閱方案——這個分歧很顯著。
換 CLI 時要注意什麼
如果你打算同時測幾個 CLI(很常見),記住兩件事:
Token / quota 各自獨立:每個 CLI 用各自的 key 跟額度,daemon 不管這層。Cursor 用完了,切去 Claude Code 繼續。
輸出風格會差:同一個 prompt 給 Claude Code 跟給 Codex,出來的 HTML 不會一模一樣——model 不同、tool calling 風格不同。Open Design 的 prompt stack 已經把差異收得很窄,但還是會有。建議是:找一個你最熟的當主力,其他當備案。
下一站:Skills 系統
CLI 偵測搞懂了,但 agent 拿到 prompt 之後實際在讀什麼?答案是 skill 目錄裡那些檔案。
下一篇我們把 19 個內建 skill 拆開來看,包括 SKILL.md 的 od: 額外 frontmatter、assets/template.html 怎麼被 read 進去、references/checklist.md 的 P0/P1/P2 是什麼意思。讀完你能寫自己的 skill,把這套機制變成你工作流的一部分。