2026-05-25
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
zntc는 오전에 번들러 경로 소유권 정리를 이어갔습니다. watch 모드에서 ResolveCache를 재빌드마다 초기화해 arena가 계속 커지는 것을 막고(#3756), putModule OOM 롤백의 이중 해제와 끊어진 맵 항목(#3758), NAPI 플러그인 virtual path 누수(#3761)를 고쳤습니다. 이어 PathRef.plugin 변형을 없애고(#3762) 변형별 owns_path를 대칭화한 뒤 bool을 Owner enum으로 바꾸고(#3768), .dataurl 페이로드 소유 구분과 별도 arena intern, 모든 변형의 OOM errdefer 회귀 테스트까지 미뤄 둔 항목 일곱 개를 차례로 병합했습니다(#3766부터 #3772). RealpathCache를 16샤드 mutex로 나누고(#3775) codegen·transform 하위 단계 측정 hook을 넣었으며, 벤치마크 데이터를 재측정해 갱신하고 mimalloc을 v3.3.2로 올렸습니다.
낮부터는 dev 서버 작업이 몰렸습니다. JS dev 서버의 모듈 단위 incremental HMR을 켜고(#3783) watch()에 skipInitialOutput 옵션을 더했으며(#3787), WatchHandle.stop()이 worker 스레드 종료까지 기다리게 하는 등 후속 수정이 이어졌습니다. runServe는 cold-start runBundle을 없애고 watch만으로 돌게 바꿨고(#3826), HMR 업데이트 모듈의 sourcemap 엔드포인트(#3820)와 여러 오류를 보존하는 WatchRebuildEvent.errors(#3822)도 들어왔습니다. 같은 시기 BoringSSL을 Chromium 148 stable에 고정한 서브모듈로 추가하고(#3786) 정적 라이브러리로 통합한 뒤(#3792), Zig 바인딩과 TLS 어댑터(#3808), --certfile·--keyfile로 켜는 dev 서버 TLS(#3817), HTTPS·WSS e2e 테스트(#3824)까지 병합했습니다. Windows Release 빌드의 TLS 컴파일 차단은 continue-on-error로 우회했습니다(#3842).
저녁에는 dev overlay 클라이언트를 단일 소스로 합치고(#3780), app 파이프라인이 JS 플러그인을 통과시키게 하며(#3827) @zntc/web/css 하위 export를 새로 만들었습니다(#3829). runAppBuild에 기본 css() 플러그인을 자동으로 붙이는 변경(#3832)은 동기 dispatcher와 비동기 cssOnLoad가 맞지 않아 실제로 동작하지 않는 코드라는 이유로 되돌렸고(#3838), dev CSS 파이프라인 역할을 정리하는 RFC 문서(#3833)를 여러 차례 고쳐 병합했습니다. RFC의 한 안이던 async buildApp 전환 PR #3839은 병합되지 않고 닫혔습니다. 영어 README를 추가하고 한국어판을 README_KO로 옮겼습니다(#3830).
suji는 Windows 지원을 크게 넓혔습니다. Windows에서 Node 백엔드와 창 이벤트를 켠 뒤(#17) 클립보드, 셸, 화면·다크 모드, globalShortcut, 투명도·메시지 상자, 파일 열기·저장 대화상자, 트레이, 알림을 Win32 API로 구현했고(#18부터 #25), 오후에는 창 그림자, WM_HOTKEY 전달용 펌프 스레드, 트레이 클릭·메뉴, 디렉터리 선택, 풍선 알림 클릭 이벤트와 코드 리뷰 후속 수정, Go c-shared DLL 로딩 수정(#35)을 병합했습니다. PR 없이 커밋한 작업도 많아 Linux의 화면·클립보드(텍스트·HTML)·셸·D-Bus 알림 API, deb·AppImage 패키징, Homebrew formula와 curl 설치 스크립트 같은 릴리스 자동화, 자동 업데이터의 매니페스트 확인·내려받기·설치, Crashpad DB에서 crashReporter 보고서 읽기, init의 GitHub Actions 워크플로 생성, Go용 TypeScript 핸들러 타입 헬퍼가 들어갔습니다.
블로그 저장소 ohah.github.io의 커밋 15개는 크론이 맞춤법·CRD 점검 완료를 기록한 커밋 14개와 활동 요약 추가 커밋 1개입니다.
공개 커밋 176개, 해당일 생성 또는 병합된 PR 84개를 정리했습니다. PR 생성 84개·병합 81개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/ohah.github.io
- cron: complete CRD doc spell check - electron-mcp-server/background.mdx
- cron: CRD_WRITE.md - 2026-05-26 06:00 spelling check completed (background.mdx)
- cron: verify docs/monthly-opensource/crd/development-5.mdx (2026-05-26 03:30 KST)
- docs: cron task completed - 2026-05-26 05:00 KST
- chore(cron): verify react-native-mcp/development-2.mdx spelling
- chore: cron task completed 2026-05-26 01:30
- docs: add 2026-05-25 activity summary
- docs: complete CRON_CRD_WRITE.md spelling verification task (2026-05-25 23:00 KST)
- cron: CRD file verification for 2026-05-25 21:00 KST (docs/monthly-opensource/hwpjs/development-1.mdx)
- docs: mark CRON task completed for 2026-05-25 20:00 KST
- chore(cron): complete 2026-05-25 19:00 spelling check - electron-mcp-server/tech-stack.mdx
- docs: cron task - verify react-native-mcp/development-1.mdx for spelling
- docs: update cron task log (2026-05-25 12:30 KST) - verified cheolsu-proxy/development-10.mdx
- docs: cron task completed - verified development-6.mdx (2026-05-25 12:00 KST)
- chore(cron): complete 2026-05-25 10:00 KST spell check
ohah/suji
- Run clipboard runtime E2E before unrelated platform tests
- Strengthen CF_HTML unit coverage
- Implement Windows clipboard HTML
- Fix Go c-shared DLL loading on Windows (-ldflags=-s -w)
- Document Linux clipboard HTML support
- Fix follow-up findings from /code-review max on PR #33
- Apply /code-review max findings + universal Win32 manifest
- Deliver Windows balloon click as notification:click
- Fill four remaining Windows native API gaps
- Add Windows IFileOpenDialog for directory selection
- Wire Windows tray click + menu + nativeTheme:updated via pump window
- Wire Windows globalShortcut WM_HOTKEY through dedicated pump thread
- Implement Linux clipboard HTML
- Implement Windows window setHasShadow via DwmSetWindowAttribute
- Fix Windows/Linux native API code-review findings
- Send Linux notification silent hint
- Align Linux notification docs and E2E notes
- Stabilize Linux openPath E2E expectation
- Implement Linux notification D-Bus
- Implement Linux shell beep
- Implement Linux shell showItemInFolder
- Implement Linux shell openPath
- Implement Linux shell openExternal
- Implement Linux shell trash
- Implement Linux clipboard text
- Implement Linux screen APIs
- Stabilize CEF Views lifecycle state
- Verify Linux window lifecycle events
- Verify Linux frameless drag regions
- Wait for ready before print to PDF e2e
- Verify Linux print to PDF output
- Stabilize auto updater quit install e2e
- Harden crash reporter validation
- Test desktop capturer SDK requests
- Harden desktop capturer source ids
- Link Linux bridge unwind runtime
- Fix Linux libstdc++ bridge link
- Add Linux auto updater e2e coverage
- Add auto updater prepare install
- Add auto updater quit and install
- Implement Windows notification via Shell_NotifyIcon balloon
- Implement Windows tray create/destroy via Shell_NotifyIconW
- Implement Windows showOpenDialog + showSaveDialog via commdlg32
- Implement Windows setOpacity + dialog.messageBox/errorBox
- Fix Linux Node bridge C++ ABI
- Implement Windows globalShortcut via Win32 RegisterHotKey
- Implement Windows screen + nativeThemeIsDark via Win32
- Add auto updater artifact downloads
- Implement Windows shell via Win32 ShellExecuteW + SHFileOperationW
- Implement Windows clipboard via Win32 OpenClipboard
- Guard macOS-only e2e tests and scope Windows cleanup patterns
- Activate window lifecycle handlers on non-macOS via CEF Views
- Self-relaunch with --do-not-de-elevate to fix Windows CEF init
- Enable Node backend on Windows via mingw libnode
- Add auto updater manifest checks
- Add Linux AppImage packaging
- Fix Bun frontend script cwd invocation
- Add Linux deb packaging
- Add curl release installer
- Skip docs deploy when Pages is disabled
- Add Homebrew formula release automation
- Test release workflow contract
- Scaffold GitHub Actions workflow in init
- Test desktopCapturer thumbnail graceful failure
- Read crashReporter reports from Crashpad DB
- Mark TypeScript handler types complete
- Type Node SDK invoke with SujiHandlers
- Add Go TypeScript handlers helper
ohah/zntc
- ci: Windows Release Build 의 사전-의도 TLS 컴파일 차단을 continue-on-error 로 회피
- style: apply oxfmt to css-modules.test.ts (a1-#2 follow-up)
- fix(web): css-modules prototype shadowing — Object.create(null) + Object.hasOwn 이중 가드 (RFC #3833 a1-#2)
- docs(rfc): v3 후속 — /code-review max 6 finding fix + D1a' → D1a'' 권장 전환 (#3833)
- docs(rfc): v3 추가 — v2-A (D1a) 구현 시도 회귀 + 대안 design 후보 (#3833)
- docs(rfc): v2 후속 — D2a→D2b flip (ZTS plugin namespace 부재 확인) + D1b infeasible 명시 + §4.5/§6 통합 (#3833)
- docs(rfc): v2 재작성 — PR-3a revert + #4 sync dispatcher 충돌 명시 (#3833)
- docs(rfc): dev CSS pipeline 통일 — cssPlugin vs dev-controller 역할 정리 (#2538 4-4)
- docs(web/css): ZNTC_NO_CSS_DEFAULTS env 멘션 제거 — PR-3a revert 후 stale (#3838 follow-up)
- revert: runAppBuild 의 default css() plugin 자동 prepend — sync dispatcher × async cssOnLoad 로 dead code (#2538 4-4 PR-3a revert)
- feat(cli): runAppBuild 의 default css() plugin 자동 prepend + opt-out (#2538 4-4 PR-3a)
- chore: remove root test_* binaries + ignore Zig test emit-bin output
- docs(readme): add English README, move Korean to README_KO
- style: apply oxfmt to css/index.ts
- feat(web): @zntc/web/css sub-export 신설 — ZntcPlugin factory + .css PostCSS pass (#2538 4-4 PR-2)
- style: apply oxfmt to comprehensive-e2e.ts
- test(dev-server): 종합 E2E — cold-start → JS incremental → graph change → HTML fallback (#3779 → #3826)
- feat(app): app pipeline plugin dispatcher 노출 — buildApp 이 JS plugin 통과 (#2538 4-4 PR-1)
- feat(dev-server): runServe 의 watch 단독화 — cold-start runBundle 제거 + HTTP listen wait (#3796/#3798 root-cause)
- fix(napi): multi-error root-cause — partial build (diagnostics) 시 success 유지 + errors 별도 노출 (#3799 cont., #3796 partial)
- style: apply oxfmt to dev-server-tls.test.ts
- test(dev-server): TLS e2e — HTTPS + WSS handshake + connected frame (#2538 4-2 PR-4)
- docs(dev-server): #3796/#3798 limitation 명시 + 일부 error msg 영어로 (UX)
- feat(napi): WatchRebuildEvent.errors 배열 — multi-error 보존 (#3799)
- test(server): PR-3a/3b deferred test 종합 backfill + log err helper (#2538 4-2)
- style: apply oxfmt to sourcemap-endpoint.ts
- feat(dev-server): HMR Update modules 의 sourcemap endpoint + sourceMappingURL append (#3799)
- style: apply oxfmt to #3813 changes
- fix(dev-server): graphChanged 시 outdir 재출력 + CSS link 재주입 (#3813 partial)
- style: apply oxfmt to skip-initial-output-warn.ts
- fix(core): #3803 minor 묶음 — skipInitialOutput build warn + stop throw retry 가능 (#3803 부분)
- feat(dev-server): TLS 통합 (TlsContext + handleConnection 분기 + --certfile/--keyfile) (#2538 4-2 PR-3b)
- fix(server): broadcastRebuildEvent 의 noop branch 도 clearError — stale overlay 해제 (#3799 부분)
- fix(napi): skipInitialOutput=true 면 incremental rebuild 도 skip_bundle_output 자동 활성 (#3802)
- fix(dev-server): cssDerived predicate 를 appDev.isCssLikeChange 헬퍼로 통일 (#3801)
- test(watch): WatchHandle.stop() 동기성 회귀 가드 (#3806 follow-up)
- test(server): TlsWriter.drainFn 의 drain contract 단위 test backfill (#2538 4-2)
- fix(dev-server): drain else 분기 3분기 fix — HTML/JSON FullReload + JS noop + CSS-only full pipeline (#3797)
- fix(build): mimalloc 을 C++ 컴파일로 처리 — MSVC ARM64 ldar64/stlr64 intrinsic 회피 (CI hotfix)
- fix(server): TLS log err → warn (test framework 의 logged-error fail 차단)
- feat(server): BoringSSL Zig binding + TLS adapter (Io.Reader/Writer 어댑터) (#2538 4-2 PR-3a)
- fix(napi): watch worker 가 outdir 받아 output path 결합 (#3795)
- fix(napi): WatchHandle.stop() 가 worker thread 종료까지 wait (#3794, #3800)
- fix(dev-server): zntc dev 가 opts.devMode 자동 set — incremental HMR runtime 주입 (#3793)
- hotfix(ci): revert composite checkout-zntc action + ignore boringssl in dependabot
- feat(build): BoringSSL 정적 lib 통합 (OPENSSL_NO_ASM=1, asm 제외) (#2538 4-1 PR-2)
- chore(boringssl): #3786 review follow-ups (CI shallow / NOTICE / cadence)
- feat(napi): watch() 의 skipInitialOutput 옵션 + runServe 적용 (#3779 follow-up)
- chore(vendor): add google/boringssl submodule pinned to Chromium 148 stable (#2538 4-1)
- fix(dev-server): closeServerForRestart 시 native watch handle stop (#3779 follow-up)
- style: apply oxfmt to hmr-rebuild-broadcast.test.ts
- feat(dev-server): JS dev server 의 module-level incremental HMR 활성화 (#3779)
- chore(dev-server): #2538 4-3 review follow-ups (EOL/leak/sentinel/invariant)
- chore(fmt): apply oxfmt + exclude dev-overlay-client.raw.js from format
- refactor(dev-server): unify dev overlay client via single source + placeholder (#2538 4-3)
- chore(deps): bump mimalloc v3.2.8 → v3.3.2
- docs(site): 벤치마크 데이터 2026-05-25 갱신 (로컬 재측정)
- perf(profile): transform sub-phase 측정 hook 추가 (T1 도구 보강)
- fix(codegen): C1 review 후속 — scope leak/measure cost/aggregation 정확화
- perf(profile): codegen sub-phase 측정 hook 추가 (C1 도구 보강)
- fix(bundler): R2 review 후속 — cross-pool N drift assert + lock-order doc
- perf(bundler): R2 (#3745) RealpathCache 16-shard mutex
- docs: ResolveCache + Owner discipline 시리즈 반영 (D104)
- test(bundler): internResolvedModule 모든 variant 의 OOM errdefer 회귀 가드 (deferred 7)
- docs(bundler): require.context panic arm 의 .virtual 미지원 명시 (review note)
- fix(bundler): resolve_imports unreachable → explicit panic (deferred 6)
- fix(bundler): .dataurl arena review 후속 — doc + r3 test 검증 강화 + lock-order
- refactor(bundler): .dataurl.data 별도 arena intern (deferred 5)
- docs(napi): buildOwnedX 헬퍼 invariants 명시 (review minor)
- refactor(napi): plugin_bridge owned ResolvedModule builder 헬퍼 (deferred 4)
- fix(bundler): Owner enum review 후속 — isOwned() helper + 코멘트 갱신
- refactor(bundler): owns_path bool → Owner enum (deferred 3)
- style: zig fmt
- fix(bundler): .dataurl 5-angle review 후속 — aliasing assert + caller contract + borrow test
- refactor(bundler): .dataurl owns_payload discriminator + mime intern (deferred 2)
- docs(bundler): .custom doc 톤 정리 (review minor)
- refactor(bundler): owns_path default 제거 — caller 강제 명시 (deferred 1)
- style: zig fmt
- fix(bundler): #3763/#3764 retro review — .custom aliasing assert + plugin_test 명시 + NAPI 명시
- refactor(bundler): .external/.custom owns_path 대칭화 (#3763 후속)
- refactor(bundler): .file/.disabled owns_path 대칭화 — .virtual 와 일관 (multi-angle finding)
- docs(bundler): resolve_imports.zig stale
.plugin참조 정리 (variant 제거 후속) - refactor(bundler): PathRef.plugin variant 제거 — #3761 후 production unused
- test(css): @charset/@layer/@import condition_tail 영구 회귀 가드 4건 추가
- style: zig fmt
- fix(bundler): #3759 5-angle review 후속 — 회귀 test + errdefer 안전 + comment fix
- fix(bundler): #3759 NAPI plugin virtual path leak (owner discriminator)
- fix(bundler): H2 5-angle review 후속 — doc 갱신 + test 강화 (ptr identity + .plugin OOM)
- fix(bundler): H2 (#3755 deferred) plugin variant 도 store-owned 로 clone
- fix(bundler): #3755 sweep review — abortPutModule + had_existing dangling map fix + test 강화
- fix(bundler): #3755 putModule OOM rollback shared backing 더블 free 차단
- fix(bundler): #3751 5-angle review 후속 — reset() 대칭 + is_first 가드 제거 + test 검증력 강화
- perf(bundler): #3751 watch mode 의 ResolveCache N-rebuild reset
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.