3-1. 일주일 만에 프레임워크 모양 갖추기 (3/30 ~ 4/6)

첫날 (3/30, 30커밋)

Initial commit: Suji multi-backend desktop framework로 시작해 하루 만에 프레임워크의 골격이 섰다.

  1. PoC 폴더 정리, 모듈 임포트 구조 확립
  2. config 파서 — TOML + JSON 이중 지원으로 시작했다가 같은 날 JSON 전용으로 되돌렸다(의존성 하나를 줄이는 쪽을 택했다)
  3. CLI dev/build/run과 config 기반 워크플로, 단일 백엔드 예제
  4. suji init 프로젝트 스캐폴딩
  5. Rust SDK(#[suji::command] 매크로)와 Go SDK(구조체 바인딩)
  6. 이벤트 시스템(pub/sub) — Zig 코어 + JS 브릿지
  7. Zig 내장 백엔드(comptime builder 패턴)
  8. 테스트 24 → 33개

CEF를 붙인 날 (4/2, 49커밋)

4월 1일에 플러그인 시스템과 첫 공식 플러그인(state), 바이너리 데이터용 로컬 HTTP asset 서버, 그리고 CEF PoC와 플랫폼 추상화(src/platform/cef.zig)가 들어갔다. 다음 날 CEF가 실제 IPC까지 연결됐다.

  • CEF IPC 레이어 — V8Handler + CefProcessMessage + BackendRegistry 브리지
  • macOS 키체인 팝업 회피 — --use-mock-keychain + ad-hoc codesign
  • Electron 호환 키보드 단축키 — NSMenu Edit 메뉴 + CefKeyboardHandler
  • suji:// 커스텀 프로토콜 도입, webview.h 의존 제거
  • macOS .app 번들링 (suji build --cef)
  • 백엔드 핫 리로드 — 파일 워처 + dylib reload + RwLock 안전성
  • Windows 빌드 지원과 CI 러너
  • E2E 24개(Puppeteer CDP, 204ms)와 IPC 테스트 54개

같은 날 libnode 임베드로 Node.js 백엔드가 붙었다. libnode 빌드 워크플로를 따로 만들고 CI에서 내려받게 했으며, Windows는 vcbuild.bat dll로 빌드했다.

SDK를 갖추다 (4/3~4/6)

  • Node.js 백엔드에 크로스 호출/이벤트 API, async invoke, GPU 비활성화
  • suji.json JSON Schema
  • @suji/node SDK와 예제 전환, 이벤트 수신(on/off/once)
  • BrowserWindow API 설계와 멀티 윈도우 PoC (4/6)

여기서 첫 구간이 끝난다. 4월 7일부터 23일까지는 커밋이 없다 — 이 시기에는 zntc 쪽 작업이 이어졌다.

이 시기의 결정

  • config는 JSON 하나로. 시작 첫날에 TOML을 넣었다 뺐다. 파서 의존성과 문서화 비용이 두 배가 되는 것이 이유였다.
  • 브라우저는 CEF 하나로. 초기 webview.h 경로를 걷어내고 CEF 단일 전략으로 정리했다(PLAN.md 갱신, 4/1).
  • 백엔드는 dylib + dlopen. 언어 중립성을 얻는 대신 핫 리로드와 RwLock 안전성 같은 문제를 직접 떠안았다.