2026-04-28
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
zntc는 PR 70개 가까이를 병합하며 CJS tree shaking과 설정 시스템 두 갈래로 나아갔습니다. CJS 쪽은 Object.defineProperty로 정의한 value·getter·멤버 값 export(#2076, #2082, #2085), module.exports 객체 멤버 값(#2093), CJS default 멤버 export(#2150)의 미사용 부분을 지우고, 안전한 __esModule 마커와 새 객체를 만드는 Object.assign·Object.freeze 호출을 순수로 다룹니다(#2090). export 이름 비교 때 문자열 escape를 디코드하고 충돌하는 export 정보는 보존하며(#2078, #2079), 직접 module.exports를 쓰는 CJS의 default import interop을 생략하고 축약 __toESM 런타임을 줄였습니다(#2097, #2098). inner graph는 순수 lazy barrel과 로컬 재수출 barrel의 emit을 건너뛰고, 엔트리의 순수 로컬과 덮어쓰인 쓰기·선언 초기값, 블록·함수 본문의 dead store를 참조 기반으로 지웁니다(#2116~#2133). 모듈 경계 주석은 //#region 마커로 바꿨습니다(#2096).
설정은 zts.config.ts/.js self-compile 로더와 zts.config.{ts,mjs,js,cjs,json} 자동 탐색, BuildOptions 전체 머지에서 시작해(#2113~#2115), 함수형 config와 --config·--mode(#2119), .env 자동 로드와 import.meta.env 정적 치환(#2120), 설정·.env 변경 시 watch 프로세스 재시작(#2123), 모드별 config 병합과 extends 상속, 오타 제안(#2128, #2129, #2130), Vitest식 zts.workspace.ts 모노레포 빌드(#2134)까지 하루 안에 들어왔습니다. TS·Zig·CLI·WASM 사이 옵션 스키마 동기화 검증을 붙여 빠진 CLI 플래그 다섯 개를 노출했고(#2132, #2136, #2138), CLI 플래그 파싱을 registry로 통합했습니다(#2149). 이 밖에 Rollup식 buildStart/buildEnd/closeBundle 플러그인 hook(#2161), base64 로더(#2163), preserveSymlinks(#2165), inline·external·linked 소스맵 모드(#2167), 번들 모드의 console·debugger 제거(#2168), Vite식 배열 alias(#2170), worker URL 치환의 AST 단계 이전(#2145)이 병합됐고, TypeScript를 6.0.3으로 올렸습니다(#2117).
suji는 main에 직접 커밋 69개를 올렸습니다. WebContentsView 작업(Phase 17-A)을 마무리하고 CEF Views API로 옮기는 17-B 계획을 정했으며, minimize·maximize·fullscreen, ready-to-show, show/hide, 취소 가능한 will-resize 같은 창 수명 주기 이벤트와 quitOnAllWindowsClosed 정책을 넣고 E2E를 13개 통과·4개 skip 상태로 맞췄습니다. Electron API 대응으로 screen, dock badge·진행률, powerSaveBlocker, macOS Keychain 기반 safeStorage, requestUserAttention, shell.trashItem·openPath, app.getPath, powerMonitor, webRequest URL 차단과 동적 listener, nativeTheme, clipboard HTML·RTF·이미지·버퍼, nativeImage, 창 투명도·그림자 등을 추가했고, Zig SDK에는 process.run과 http.fetch를 넣었습니다. TypeScript 타입 안전 invoke를 위해 SujiHandlers 모듈 augmentation과 Zig comptime 타입 추출, Rust specta 연동도 1차로 붙였습니다.
bungae는 Metro 호환 JS hook을 추가했습니다. cheolsu-proxy는 자동 TLS passthrough 보강 #339를 병합하고, OpenSSL 번들링 CI의 Rust 캐시와 JS 워크플로의 Node 24 전환 등 CI를 손봤습니다. ohah.github.io에는 오늘의 커밋 목록과 메타 갱신, 4월 28일 요약이 올라왔습니다.
공개 커밋 195개, 해당일 생성 또는 병합된 PR 71개를 정리했습니다. PR 생성 70개·병합 71개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/bungae
ohah/cheolsu-proxy
- Avoid stale Rust cache in OpenSSL bundling CI
- Fix MCP store warning under CI
- Use Node 24 in JavaScript workflows
- Harden automatic TLS passthrough
ohah/ohah.github.io
- docs: update CRON_CRD_WRITE.md - 2026-05-02 all files completed
- chore(cron): mark all mdx files checked (2026-04-29)
- cron: mark all mdx files as completed (2026-04-29)
- CRON_CRD_WRITE.md: mark all mdx files completed (2026-04-29)
- chore: fix typo in craby development-3.mdx (extra space)
- chore: update cron checklist for electron-mcp-server development files
- chore: fix typo in hwpjs development-3.mdx (docker) and update cron checklist
- docs: update today-commit metadata
- docs: update CRON_CRD_WRITE.md completion status (2026-04-29)
- docs(today-commit): add 2026-04-28 summary
- docs: mark docs/monthly-opensource/crd/development-2.mdx as CRD-checked (2026-04-28)
- cron: mark all CRD files checked (2026-04-28)
- chore(cron): mark all .mdx files as checked in CRON_CRD_WRITE.md
- chore: mark CRON_CRD_WRITE.md as completed
- cron: mark CRON_CRD_WRITE.md as completed in checklist
- docs(today-commit): list 2026-04-24, 2026-04-26 in index
- CRON: Mark all CRD docs as completed
ohah/suji
- refactor: simplify findings — helper 재사용으로 ~54줄 정리
- feat(api): BrowserWindow.setOpacity/getOpacity/setBackgroundColor/setHasShadow/hasShadow
- feat(api): clipboard.readRTF/writeRTF + readBuffer/writeBuffer
- feat(api): app.isPackaged + app.getAppPath
- feat(api): webContents.setAudioMuted / isAudioMuted
- feat(api): nativeTheme:updated 이벤트 (NSAppearance KVO)
- refactor: simplify findings — TIFF detour 제거, base64 응답 helper, overflow safety
- feat(api): nativeImage.toPng / toJpeg — file → base64 (NSBitmapImageRep)
- refactor: idle_state f64 직접 비교 — NaN/Inf panic 회피
- feat(api): powerMonitor.getSystemIdleState(threshold)
- refactor: simplify findings — session API + cef cookie_manager refcount
- feat(api): app.exit + session.clearCookies/flushStore
- feat(api): nativeImage.getSize — file → dimensions (NSImage)
- feat(api): clipboard.writeImage / readImage — PNG base64 round-trip
- feat(api): app.setProgressBar — dock 진행률 (NSDockTile + NSProgressIndicator)
- feat(api): app.getLocale — Electron
app.getLocale()동등 - refactor(cef): simplify 후속 — clipboard inline NSString → nsStringFromCstr/Slice
- feat(api): nativeTheme.setThemeSource + screen.getPrimaryDisplay — 2 API
- feat(api): clipboard.has/availableFormats + app.isReady/focus/hide — 5 API
- refactor(cef): simplify 후속 — nsFileUrlIfExists + clipboard Type 헬퍼 + NSPoint 재사용
- feat(api): app.getName/getVersion + screen.getDisplayNearestPoint — 3 API
- feat(api): clipboard HTML + powerMonitor.getSystemIdleTime — Electron API 2개
- feat(api): nativeTheme + shell.openPath + screen.getCursorScreenPoint — 미구현 Electron API 3개
- docs(plan): 미구현 Electron API 비교 표에 명시 추가
- docs(plan): 구현 완료 항목 동기화 + 시스템 통합 표 항목 추가
- refactor(web-request): UrlGlobPool 추출 + Go deprecated 제거 + drop counter
- fix(web-request): dynamic listener round-trip e2e 통과 — typeof 페이로드 처리
- feat(web-request): dynamic listener (RV_CONTINUE_ASYNC + pending callback)
- refactor(zig-sdk): simplify 후속 — emitSchemaTs std.Io.Writer.fixed + 중복 가드 제거
- feat(rust-sdk): specta v2 re-export — Type derive로 ts 시그니처 추출 가능
- feat(zig-sdk): typeToTs comptime + App.schema chain — TypeScript bindings 1차
- feat(node-sdk): type-safe call/callSync — SujiHandlers augment 지원
- feat(api): TypeScript type-safe invoke — SujiHandlers module augmentation
- refactor(web-request): simplify 후속 + e2e 갭 보완
- feat(web-request): URL glob blocklist + before-request/completed 이벤트 (Electron
webRequest) - refactor(b+c): simplify 후속 — buildAppCachePath 중복 제거 + destroy_window IPC + SDK round-trip e2e
- feat(power): powerMonitor — NSWorkspace 옵저버로 4 이벤트 자동 발신 (macOS)
- feat(zig-sdk): http.fetch — std.http.Client.fetch wrap (백엔드 only)
- feat(zig-sdk): process.run — std.process.run wrap (백엔드 only)
- test(splash): 스플래시 스크린 패턴 e2e — windows.create + isLoading polling
- feat(app): app.getPath (Electron 표준 7 키)
- feat(shell): trashItem (macOS NSFileManager
trashItemAtURL:) - refactor(sdk): simplify 후속 — Rust json! 매크로 / e2e 구조화 / Go attention 정렬
- feat(sdk): Rust/Go/Node에 screen/powerSaveBlocker/safeStorage/dock/attention 노출
- feat(zig-sdk): screen / powerSaveBlocker / safeStorage / dock / requestUserAttention 노출
- feat(api): @suji/api에 screen/powerSaveBlocker/safeStorage/app SDK 추가
- refactor(attention): cmd <noun>_<verb> 컨벤션 + e2e 강화 + void-return 비대칭 문서화
- feat(system): app.requestUserAttention — dock bounce (NSApp request/cancel)
- refactor(safe-storage): SecItemUpdate fallback + kCFBooleanTrue + msgSendVoid2 헬퍼
- feat(system): safeStorage (macOS Keychain) — set/get/delete IPC + e2e 4 케이스
- refactor(system): dock_set_badge 16KB→256B + nsStringFromCstr 명명 정리
- feat(system): screen.getAllDisplays / dock badge / powerSaveBlocker / find-result 이벤트
- docs(plan): Phase 5 완료 + globalShortcut 체크박스 stale 정정
- refactor(window): Phase 5 디버그 잔재 정리 + 미커버 케이스 문서화
- fix(e2e): 환경 의존 테스트 skip + trace 제거 — 13 pass / 4 skip / 0 fail
- fix(e2e): startCollect helper로 listener 등록 race 회피 — 13/17 pass
- test(e2e): listener registration race wait — ready-to-show 안정화 시도
- fix(window): maximize 직접 emit + fullscreen collectionBehavior + lifecycle 디버그
- fix(cef): 새 창 빈 URL fallback to about:blank — ready-to-show / page-title-updated 발화
- test(e2e): Phase 5 lifecycle e2e 실측 — will-resize 가정 정정 + 5 fail 마커
- refactor(window): Phase 5 holistic review fix + SDK 호환성 테스트
- feat(window): Phase 5-5 quitOnAllWindowsClosed 정책 옵션
- feat(window): Phase 5-4 will-resize 취소 가능 이벤트 (macOS)
- feat(window): Phase 5-3 show / hide 이벤트
- feat(window): Phase 5-2 ready-to-show + page-title-updated 이벤트
- feat(window): Phase 5 라이프사이클 이벤트 — minimize/maximize/fullscreen
- docs(plan): 17-B Option F를 단일 길로 못박기 — Hybrid 후퇴 X
- docs(plan): Phase 17-B plan — CEF Views API architecture migration (Option F)
- fix(window): Phase 17-A C 마무리 — wrapper NSView + dynamic destroy known limitation
ohah/zntc
- fix(docs): make markdown tables responsive
- refactor(bundler): consolidate computed key purity helper, sharpen tests
- feat(bundle): drop console / debugger 를 bundle 모드에 적용
- feat(napi): logLevel / logLimit 옵션 NAPI 연결 (#2158)
- fix(bundler): reduce json and computed key bundle output
- feat(resolve): alias 의 array (Vite 식 RegExp / 함수형 find) 지원
- feat(sourcemap): inline / external / linked 3-mode 지원
- chore(benchmark): align rolldown output format
- refactor(bundler): extract moduleHasEvaluationEffect helper
- docs: document Korean PR communication
- feat(bundler): narrow export-star source fallback
- test(resolver): preserveSymlinks=true 테스트 양성 검증 추가
- feat(resolver): preserveSymlinks CLI/config flag 활성화
- feat(loader): base64 loader + 각 loader codegen 검증
- feat(plugin): buildStart / buildEnd / closeBundle lifecycle hook
- refactor(bundler): dedupe cjs default proxy seeding helpers
- feat(bundler): prune cjs default member exports
- chore(cli): zts.mjs flag parsing 을 registry 기반으로 통합
- docs: add AGENTS guide link
- refactor(bundler): extract seedStmt helper + clarify ESM gate intent
- fix(bundler): preserve ESM export writes in tree shaking
- refactor(bundler): handle worker URL replacement in codegen AST
- fix(bundler): support node worker cjs bundles
- refactor(bundler): consolidate dead-store helpers + lift functionBodyBlock to ast
- refactor(bundler): use references for inner graph dead stores
- chore(schema): 두 TS schema sync allowlist 를 NAPI_INTERNAL_ONLY_KEYS 로 통합
- chore(schema): 핵심 키 coarse type drift 검증 추가
- refactor(cli): dispatchBuild 추출 — runWorkspace ↔ main 의 dispatch 중복 제거
- chore(workspace): resolveWorkspaceEntries / ResolvedWorkspace export 제거
- chore(workspace): resolveWorkspaceEntries @deprecated — 권장 패턴 명시
- chore(simplify): outbase silent drop + globalIdentifiers 중복 + opts default sync 검증
- test(cli): browserslist / verbatim-module-syntax 의미 검증 강화
- feat(cli): 누락된 BuildOptions 키 5개 CLI flag 노출
- fix(cli): --banner / --footer 정식 형태 추가, --banner:js= 는 alias 유지
- chore(schema): CLI flag ↔ BuildOptions ↔ WASM schema sync 검증
- fix(cli): zts.config.outdir/outfile 가 단일 build 에서 silent drop
- feat(workspace): zts.workspace.ts (Vitest 식 모노레포)
- chore(schema): TS BuildOptions ↔ Zig DTO 양방향 schema sync
- feat(bundler): extend inner graph dead stores to blocks
- feat(config): Levenshtein "did you mean?" typo 검출
- feat(config): extends 상속 + 순환 참조 감지
- feat(bundler): prune overwritten declaration initializers
- feat(config): --mode + zts.config.{mode}.* 자동 머지
- test(cli): expand watch restart + Phase 1/2 coverage gaps
- feat(watch): config / .env 변경 시 자동 process restart
- docs(config): tsconfig vs zts.config vs CLI 우선순위 문서화
- feat(bundler): prune overwritten dead writes
- fix: unblock docs build
- feat(zig): applyZtsConfigJson bundler-only 옵션 매핑 확장
- refactor(config): apply /simplify follow-up
- feat(config): .env 자동 로드 + import.meta.env 정적 치환
- feat(bundler): prune pure entry locals in inner graph
- feat(bundler): skip local re-export barrels
- feat(config): 함수형 config + --config <path> + --mode flag
- docs(tsconfig): explain rootDir choice for cross-package shared imports
- chore(deps): TypeScript 5.9.3 → 6.0.3 업그레이드
- feat(bundler): skip pure lazy barrel emit
- fix(cli): forward merged BuildOptions to NAPI buildOpts
- refactor(config): apply /simplify follow-up
- feat(cli): JS config 의 BuildOptions 전체 머지
- refactor(config): apply /simplify follow-up
- feat(cli): zts.config.{ts,mjs,js,cjs,json} 자동 탐색
- refactor(config): apply /simplify follow-up
- feat(config): .ts/.js config self-compile loader
- refactor(runtime): extend __toESM compaction to non-min and decorator helpers
- fix(runtime): compact minified __toESM helper
- test(cjs): add __esModule marker to fixtures asserting __toESM emit
- refactor(cjs): consolidate direct default import helpers
- feat: skip cjs default interop for direct module exports
- feat(emitter): use //#region markers for module/polyfill boundaries
- fix(benchmark): capture size-gap stdout via shell redirect
- fix(benchmark): exclude object form from "module.exports =" count
- test(benchmark): audit object-assign and merge-descriptors gaps
- feat(cjs): support module.exports object member values
- test(cjs): cover module.exports object member values
- fix(docs): hero mobile overflow — grid items min-w-0 + break-words
- refactor(purity): tighten isKnownPureStaticCall signature
- test(tree-shake): expand pure-call and __esModule guards
- style: format updated tests
- feat(cjs): prune safe __esModule markers
- test(cjs): cover __esModule marker pruning
- feat(purity): treat fresh Object.assign calls as pure
- test(purity): cover Object.assign pure-call pruning
- feat(purity): treat fresh Object.freeze calls as pure
- refactor(codegen): fn_name_stack borrows builder-owned name slices
- fix(ci): docs deploy queue instead of cancel-in-progress
- test(benchmark): lock CJS pruning audit fixtures
- fix(function_map): prevent UAF on names.append OOM in internName
- refactor(stmt_info): reuse staticMemberParts in defineProperty value seed
- feat(tree_shaker): support defineProperty member value facts
- refactor(codegen): remove residual local dispatch helpers
- refactor(codegen): unify staticKeyName with ast API (Phase 2)
- fix(tree_shaker): seed conflicting CJS export facts precisely
- CJS defineProperty getter export DCE 추가
- refactor(ast): unify staticKeyName API with escape decode (Phase 1)
- chore: format size-gap diagnostics
- fix: prune safe-buffer CJS fallback
- refactor(string_escape): share unicode hex escape decoder
- refactor(stmt_info): extract deinitCjsExportFactsBuf helper
- refactor(stmt_info): reorder seen HashMap defer to avoid dangling-key window
- CJS export fact 충돌 보존
- fix(bundler): decode JS string-literal escapes for CJS export name matching
- refactor(stmt_info): consolidate CJS export fact building
- CJS defineProperty value export DCE 추가
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.