main.c — 單一二進位入口

一個二進位,MCP server / CLI / install / update / config 全包
檔案:src/main.c(2,418 行)

大方向

main.c 是整個二進位的入口。它根據第一個參數決定進入哪個模式:無參數 → MCP stdio server;cli → 單次指令;install/update/uninstall/config → 安裝與設定子指令。設計哲學是單一靜態二進位:不另外帶 companion executable。


1. 模式分派

main() main.c依 argv[1] 決定 MCP / CLI / install 模式。

開頭先做基礎初始化(記憶體、log、平台抽象),然後分派:

  • 無參數或 stdio → MCP server(mcp/mcp.c
  • cli → 單次 CLI 指令(不啟動 daemon)
  • install / update / uninstall / configcli/cli.c
  • --ui=true → 啟動 3D UI(ui/

2. 與 daemon 的關係

MCP 模式的 daemon 連線 main.cMCP 模式啟動或連上 per-account daemon。

MCP 模式不是自己包辦一切:它透過 daemon(daemon/)共享 watcher、索引 job、UI。第一個 daemon-backed session 啟動 daemon,最後一個 session 關閉它。CLI 模式刻意分離——單次指令不啟動 daemon、不留常駐 process。

3. 維持 stdout 乾淨

log 路由 main.c日誌走 stderr / daemon log,stdout 只留 MCP JSON-RPC。

MCP 是 stdio 協議:stdout 只能有 JSON-RPC,混入任何日誌都會讓 client 解析失敗。所以日誌被導到 stderr(session 層)或 ${CBM_CACHE_DIR}/logs/cbm-daemon.log(daemon 層)。--progress 只寫 stderr,讓 pipe/script 保持機器可讀。

看完這頁你應該能說出:單一二進位的分派邏輯、MCP 模式如何跟 daemon 合作共享資源、CLI 模式為何刻意不啟動 daemon、以及 stdout 乾淨對 MCP 協議的重要性。