2026-04-13
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
zntc의 worklet 변환은 Babel 플러그인과의 parity를 마무리했습니다. 파일 단위 'worklet' directive(#1181), implicit context·globals·CJS dehoist를 담은 Phase 6 마지막 묶음(#1184)에 이어 __classFactory로 parity 테스트 169개를 모두 통과했고(#1185), context object factory와 플러그인이 바꾼 클래스의 ES5 lowering, Babel식 익명 이름을 넣었습니다(#1187, #1188). 실제 앱에서 드러난 문제로는 사용자 react-native-worklets 버전을 __pluginVersion에 넣기(#1186), worklet 본문 안 --define 치환 억제(#1194), object hook 프로퍼티 자동 worklet화(#1202), __stackDetails 형식과 __initData.code의 shorthand 구조 분해(#1203, #1205)가 있었고, 빈 sourceMap 필드가 UI 런타임 초기화를 깨뜨려 다시 뺐습니다(#1206). 드래그 제스처 실패의 근본 원인은 package.json sideEffects 설정이 자동 순수성 판정에 덮이던 tree shaking 문제였습니다(#1207).
구조 면에서는 AST 플러그인에 Babel식 visitor hook을 도입하고(#1182), worklet과 refresh의 런타임 상태를 PluginState로 분리해 그 규칙을 D097로 기록했으며(#1196~#1199), 클로저 분석 캐시를 하나로 합쳤습니다(#1213). dev 서버에는 빌드 이벤트를 흘리는 SSE 엔드포인트(#1216), /reset-cache Control API(#1217), LLM 에이전트용 MCP JSON-RPC 서버(#1218), graceful shutdown(#1222)이 붙었습니다. HMR 성능 이슈 #1223에 대응해 이벤트 기반 watcher와 50ms debounce, 내용 해시 캐시, 재파싱 모듈 목록과 단계별 소요 시간 노출을 병합했습니다(#1227, #1231, #1232).
소스맵은 Metro 호환 x_facebook_sources function map 수집과 RN 프리셋 자동 활성화(#1251, #1252), HMR용 모듈별 독립 소스맵(#1253), 폴리필을 소스로 등록하는 prologue 매핑 수정(#1225)이 들어왔습니다. 이 밖에 "use client"/"use server" directive 보존과 다중 엔트리 CLI(#1242), import attributes 등 AST 스키마 보강(#1246), ES2022 미만 private field 다운레벨링(#1254), direct eval/with 스코프의 mangling 차단(#1263), dynamic import 대상 모듈의 export 보존(#1264), Windows NAPI 링크(#1255)가 병합됐습니다. CLI 레퍼런스와 가이드, 루트 ROADMAP을 현재 구현에 맞춰 갱신하고 Babel 이관 가이드를 썼습니다(#1234, #1238~#1241). compat-table 기반 생성기(#1268)와 browserslist 지원(#1269)은 이날 PR이 열렸습니다.
bungae는 예제 앱에 worklet 전 단계 데모와 Reanimated 데모 다섯 개, ScrollView 안에서도 동작하는 독립 DragDemo를 넣고, 설치된 react-native-worklets 버전을 감지해 __pluginVersion에 넘기도록 했습니다. 위 zntc 수정을 따라 서브모듈을 여러 번 올렸고, iOS 26 iPad에서 전체 화면을 강제하는 설정을 다시 손봤습니다.
공개 커밋 99개, 해당일 생성 또는 병합된 PR 71개를 정리했습니다. PR 생성 71개·병합 66개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/bungae
- chore(example): remove DragDemo diagnostic console.logs
- chore: bump zts — fix export default namespace import assignment (#1210)
- chore: bump zts — lock package.json sideEffects (#1207, root cause of #1193)
- debug(example): add console.log to DragDemo gesture callbacks
- chore: bump zts to drop empty sourceMap field (#1206)
- chore: bump zts to include worklet shorthand+sourceMap fix (#1205)
- chore: bump zts to include __stackDetails Babel format fix (#1203)
- chore: bump zts to 5486398 (object-hook autoworklet + gesture receiver validation)
- refactor(example): extract drag into independent DragDemo with ScrollView-safe Pan config
- fix(example): remove workletWebCheck demo (requires substitute_web_platform_checks option)
- feat(example): add 5 Reanimated demos + bump zts with worklet fixes
- chore: bump ZTS submodule to main (ES5 class lowering + anon naming)
- fix: add missing @babel/plugin-transform-class-properties for Metro worklet compat
- fix(ios): require fullscreen on iPad (iOS 26 windowed default 회피)
- fix(napi-build): detect react-native-worklets version for __pluginVersion
- example(ExampleApp): add ZTS worklet parity demos for all phases
ohah/zntc
- test(mangler,tree-shaker): #1259 #1262 회귀 방지 커버리지 추가
- fix(shared): ES_TARGET_BITS off-by-one — hashbang/using 비트 정정
- test(tree-shaker): dynamic import / class edge cases + /simplify 중복 제거
- fix(tree-shaker): dynamic import target module + exports preservation (#1260)
- refactor(mangler): /simplify — Scope.blocksMangling() + markScopeFieldToRoot 통합
- fix(mangler): direct eval/with 스코프의 바인딩 mangling 차단 (#1258)
- fix(transformer): downlevel class private fields below ES2022
- fix(transformer): wrap class expression with private methods in IIFE
- fix(transformer): preserve labels on lowered for-of in ES5 downlevel
- fix(napi): link Windows import library from node-api def files
- chore: remove accidentally committed bundle artifacts
- test(hmr): per-module sourcemap 다중 모듈 부분 변경 시나리오 (#1248)
- feat(hmr): per-module standalone sourcemap in WatchRebuildEvent (#1248)
- refactor(sourcemap): /simplify — generateJSONWithFunctionMap 직접 직렬화로 중간 버퍼 제거
- feat(bundler): Metro x_facebook_sources per-source function maps + RN preset auto-activation
- refactor(codegen): /simplify — fix resolveMethodName double-alloc + clean up test imports
- style(codegen): zig fmt
- feat(codegen): Metro x_facebook_sources function map collection
- simplify(sourcemap): deduplicate appendJsonString, clean up FunctionMapBuilder
- feat(sourcemap): Metro-compatible FunctionMap VLQ encoder
- docs: estree 어댑터 도입 토론 문서
- feat(ast): preserve import attributes / import defer-source / TS type param modifiers
- docs: AST 신규 노드 추가 체크리스트 + WASM 플러그인 호스트 토론 문서
- feat(playground): expose all transpile options
- fix(devserver): SSE broadcast TCP flush via SseSink wrapper
- feat(rsc): preserve "use client"/"use server" directives + multi-entry CLI
- test(watch): Issue #1223 커버리지 보강 + content hash 한도 RN 대응
- docs(guides): 미니파이 세분화/엔진 타겟/포맷 5종 등 현재 스펙 동기화
- docs(cli): 현재 CLI 스펙에 맞게 reference/cli.md 전면 갱신
- docs(roadmap): 루트 ROADMAP.md 전면 동기화
- docs(roadmap): mark decorator/static-block/accessor as completed
- refactor: simplify 리뷰 반영
- refactor(server): TrackedFileSet — watcher + content-hash 캡슐화 (#1229 Part 2)
- refactor: hoist wyhash import + drop redundant test comment
- refactor(util): extract util/wyhash.zig helpers (#1229 Part 1)
- docs: Babel → ZTS 이관 가이드 (KO + EN)
- refactor: collapse reparsed_count + incremental flag into ?usize (simplify)
- feat(watch): expose reparsedModules + incremental-cache initial build (#1223 Phase 2)
- refactor(watch): simplify findings — streaming hash + diff resync + helper consolidation
- feat(watch): event-based watcher + 50ms debounce + content hash cache (#1223 Phase 1)
- refactor: extract nsToMs helper + trim narrating comments (simplify)
- feat(watch): expose phaseDurations on WatchRebuildEvent (#1223 Phase 3)
- docs: SSE/Control API/MCP 가이드 + EN 누락 페이지 추가
- fix(sourcemap): register polyfills as sources + correct prologue mappings
- test(server): Bun 기반 SSE/Control API/MCP 통합 테스트
- feat(server): graceful shutdown() API for DevServer
- refactor(server): /simplify findings + 11 unit tests for SSE/MCP
- feat(server): MCP (Model Context Protocol) JSON-RPC server
- feat(server): Control API — /reset-cache endpoint
- feat(server): SSE endpoint + lifecycle event broadcasting
- refactor(transformer): guard closure cache by function node_idx
- fix(benchmark): Windows 경로 이스케이프 + .exe 확장자 (#1091)
- refactor(transformer): unify closure analysis via ctx-owned cache (#1114)
- fix(bundler): drop
varin ESM-wrap synthetic binding assignment (#1209) - chore(codegen): unify export default ns-var branch style
- fix(codegen): assign ns var for export default of namespace import
- fix(tree-shake): lock package.json sideEffects from auto-purity override
- fix(worklet): drop empty sourceMap field — causes Reanimated UI Runtime init failure
- fix(worklet): shorthand destructuring + sourceMap field in __initData.code (Babel parity)
- refactor(test): extract Worklet tests into worklet_test.zig
- fix(worklet): emit __stackDetails with global.Error() to match Babel plugin
- feat(worklet): auto-workletize object-hook property values
- fix(bundler): avoid duplicate init call for CJS side-effect import
- fix(bundler): emit init call for side-effect-only import to ESM module
- refactor(transformer): extract visitWithRefreshSuppressed neutral API
- docs(decisions): D097 — PluginState 구조체 분리 규칙 기록
- refactor(transformer): move refresh state into PluginState.refresh
- chore: update comments with new plugins.worklet.* field names
- refactor(transformer): move worklet state into PluginState.worklet
- refactor(worklet): wrap async function/arrow body visits with visitBodyWorkletAware
- fix(worklet): suppress --define substitution inside worklet function bodies
- refactor(worklet): drop dead .program tag check, extract test return-check helper
- fix(worklet): preserve implicit return for arrow ExpressionBody in __initData.code
- fix(worklet): suppress Fast Refresh registration inside factory IIFE
- test(worklet): add anon naming + ES5 class lowering parity tests
- feat(worklet): ES5 lowering for plugin-replaced classes + Babel-style anon names
- feat(worklet): functional context object factory body + parity ZTS tests
- feat(worklet): Phase 5 __classFactory — 169/169 parity tests pass
- fix(worklet): inject user's react-native-worklets version into __pluginVersion
- feat(worklet): Phase 6 final batch — implicit context + globals + CJS dehoist
- test(worklet): activate export form file-workletization tests (Phase 6.4+)
- refactor(plugin): Babel-style visitor hooks for AST plugins
- feat(worklet): file-level 'worklet' directive (Phase 6.4 basic)
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.