2026-04-15
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
zntc는 전날 시작한 번들러 심볼 리팩터링을 끝까지 밀었습니다. 합성 default와 래핑 모듈의 init/exports 심볼을 시맨틱 심볼 공간에 등록하고(#1339, #1341), 번들러 전용 SymbolTable을 별칭만 담는 AliasTable로 줄였습니다(#1342~#1344). 이어 import·export 바인딩이 문자열 이름 대신 심볼 참조를 쓰도록 바꾸고, linker의 canonical_names 문자열 맵을 없애 Symbol.canonical_name 필드로 옮겼으며, local_name 조회 사이트를 여러 묶음으로 나눠 이전했습니다. 이 과정이 PR 30여 개(#1345부터 #1374까지)로 병합됐고, 아키텍처 문서도 갱신했습니다(#1378). barrel의 export { default as X } from 재수출에서 소스 모듈 래핑이 빠지던 버그(#1375)도 함께 고쳤습니다.
ES5 다운레벨링에서 Hermes 실패 패턴을 계속 잡았습니다. for-await-of의 var 초기화와 ES5 미만 lowering(#1380, #1390), for-of 본문 구조 분해(#1391), 객체 메서드 shorthand(#1392), for-in let/const의 TDZ 초기화(#1393), top-level await를 async IIFE로 감싸기(#1394), 정규식 dotAll·named capture(#1395), 중괄호 유니코드 이스케이프의 surrogate pair 변환(#1396)입니다. 이후 공유 타깃 비트 레이아웃을 compat.zig와 맞췄고(#1400), 합성 노드 span을 소스에서 직접 읽어 범위를 벗어나던 문제를 transformer·codegen·semantic·번들러 전반에서 getText로 바꿔 막았습니다(#1405, #1412). panic이 나면 신고 안내를 띄우는 Bun 스타일 crash report도 추가했습니다(#1409).
Metro 호환 기능으로는 그래프 밖 경로를 감시하는 watchFolders(#1414), 일반 해석이 실패할 때만 쓰는 resolve fallback(#1416), RN 전용 AssetRegistry 출력과 @2x/@3x 변형 자동 감지(#1417, #1418), resolver blockList(#1419)를 넣었고, TS 타입에 빠져 있던 strictExecutionOrder 등 BuildOptions 세 개를 채웠습니다(#1415).
bungae는 Hermes에서 실패하던 ES5 패턴 11종을 담은 스트레스 케이스를 예제 앱에 넣었다가 async 함수와 계산된 객체 키로 좁혔고(#57), Rozenite를 위한 server.enhanceMiddleware, rewriteRequestUrl, symbolicator.customizeFrame 등 Metro 설정 hook과 watchFolders 전달을 연결했습니다. 설정 스키마와 dev 서버 문서도 실제 구현에 맞춰 다시 썼습니다. ohah.github.io에는 4월 8일부터 15일까지의 오늘의 커밋 페이지가 추가됐습니다.
공개 커밋 90개, 해당일 생성 또는 병합된 PR 64개를 정리했습니다. PR 생성 63개·병합 64개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/bungae
- feat(zts): wire watchFolders through to ZTS NAPI
- docs(skills): rewrite dev-server.md to match actual implementation
- docs(skills): sync config.md schema with actual BungaeConfig
- docs: add ZTS Metro config hook compatibility matrix to CLAUDE.md
- feat(zts): add Metro-compatible rewriteRequestUrl + symbolicator.customizeFrame
- chore: bump zts submodule
- test(example-app): narrow ES5 downlevel repro to async function + computed object
- chore(example): update Podfile.lock for RNSVG 15.15.4
- feat(zts): add Metro-compatible server.enhanceMiddleware hook for Rozenite
- test(example-app): ES5 다운레벨 스트레스 케이스 추가
ohah/ohah.github.io
ohah/zntc
- feat(resolver): blockList — Metro resolver.blockList 호환
- feat(asset): @2x/@3x scale variant 자동 감지 + emit
- feat(asset): Metro AssetRegistry 호환 출력 (RN 전용 레이어)
- feat(resolve): fallback 옵션 (webpack resolve.fallback / Metro extraNodeModules)
- fix(core): BuildOptions에 strictExecutionOrder/scopeHoist/workletTransform 누락 추가
- refactor(watch): 공통 walker src/server/watch_scan.zig로 통합
- refactor(watch): hasSkippedSegment/passesWatchGlobFilter 추출 + TOCTOU 제거
- feat(watch): watchFolders 옵션 지원 — 그래프 밖 루트 감시
- fix(cli): --allow-overwrite 체크 시 realpathAlloc 결과 leak
- fix(codegen): broad source deref audit — getText 전환 (#1407)
- fix(semantic): broad source deref audit — getText 전환 (#1407)
- fix(bundler): broad source deref audit — getText 전환 (#1407)
- chore(crash-handler): URL 을 깃헙 레포 링크로 단순화
- feat(diagnostics): Bun 스타일 crash report — panic handler + 신고 안내
- chore(transformer): /simplify #1404 후속 — 누락 사이트 + 매직 넘버 + 회귀 테스트 보강
- fix(transformer): 합성 노드 span 의 STRING_TABLE_BIT 처리 — getText 일괄 사용 (#1404)
- chore(transformer): unicode brace escape 유틸 재사용
- chore(transformer): for-of/for-await loop var assign helper 통합
- chore(fixtures): RN snapshot 재생성 — PR #1400 (shared bitmask fix) 후속
- fix(shared): ES_TARGET_BITS / FEATURES 를 compat.zig 28-bit 레이아웃으로 동기화
- fix(transformer): unicode brace escape \u{X} → surrogate pair lowering (#1388)
- chore(transformer): /simplify #1387 후속 — 단일 버퍼 조립 + OOM 전파
- fix(transformer): regex dotAll/named capture 다운레벨 (#1387)
- fix(transformer): top-level await 를 async IIFE 로 감싸 bare yield leak 방지 (#1384)
- fix(transformer): for-in let/const 바인딩의 TDZ void 0 init 생략 (#1386)
- fix(transformer): object literal method shorthand 를 key:function 으로 lowering (#1385)
- fix(transformer): for-of body array/object destructure 를 var+인덱스 접근으로 lowering (#1383)
- fix(transformer): for-await-of ES5 미만 타겟에서 iterator+await 루프로 lowering (#1381)
- fix(codegen): for-await-of var init hoist/skip 누락 수정 (#1379)
- docs(architecture): symbol table + AST 정규화 최신화
- refactor(transformer): visitExtraList 시그니처를 NodeList로 통일 (#1325)
- chore(bundler): /simplify #1340 후속 — helper 추출 + regex 정밀화
- fix(bundler): export { default as X } from re-export 시 source 모듈 wrap 누락 (#1340)
- chore(bundler): /simplify Phase 4c-4e 후속 — SymbolRef.makeSemantic + 주석 (#1328)
- refactor(bundler): Phase 4c-4e — eb.symbol fill-in을 scan 시점으로 이전 (#1328)
- chore(bundler): /simplify Phase 4c-4d 후속 — SymbolRef.semanticIndex 헬퍼 + 정리 (#1328)
- refactor(bundler): Phase 4c-4d (batch 6) — module_scope.get(ib.local_name) → ib.local_symbol (#1328)
- refactor(bundler): Phase 4c-4d (batch 5) — preamble fallback ib.local_name 마이그레이션 (#1328)
- refactor(bundler): Phase 4c-4d (batch 4) — linker.zig eb.local_name 마이그레이션 (#1328)
- refactor(bundler): Phase 4c-4d (batch 3) — chunks/tree_shaker eb.local_name 마이그레이션 (#1328)
- refactor(bundler): Phase 4c-4d (batch 2) — eb.local_name 마이그레이션 (#1328)
- refactor(bundler): Phase 4c-4d (batch 1) — m.exportBindingLocalName 마이그레이션 (#1328)
- refactor(bundler): Phase 4c-4d — Module.importBindingLocalName / exportBindingLocalName 헬퍼 (#1328)
- refactor(bundler): Phase 4c-4d — emitter/chunks의 eb.local_name → eb.symbol 단축 (#1328)
- refactor(bundler): Phase 4c-4d — populateImportSymbols가 .local export 심볼도 채우게 (#1328)
- refactor(bundler): Phase 4c-4d — ib.local_name → ib.local_symbol 직접 사용 (#1328)
- refactor(bundler): Phase 4c-4d (start) — buildImportRenames의 imported_name 조회 SymbolRef화 (#1328)
- refactor(bundler): Phase 4c-4c — ImportBinding.importsDefault() helper (#1328)
- refactor(bundler): Phase 4c-4b — chunks.zig RevKind 분리 + "*" sentinel 제거 (#1328)
- refactor(bundler): Phase 4c-4a — ExportBinding.Kind 분리 (re_export_star/re_export_namespace) (#1328)
- chore(bundler): /simplify Phase 4c-3c 후속 — 회귀 복구·중복 제거 (#1328)
- refactor(bundler): Phase 4c-3c-4b — canonical_names string map 제거 (#1328)
- refactor(bundler): Phase 4c-3c-4a — synthetic 심볼 canonical_name mirror 보강 (#1328)
- refactor(bundler): Phase 4c-3c-3 — reader가 Symbol.canonical_name 우선 (#1328)
- refactor(bundler): Phase 4c-3c-2 — canonical_names writer mirror to Symbol (#1328)
- refactor(semantic): Phase 4c-3c-1 — Symbol.canonical_name 필드 추가 (#1328)
- chore(bundler): /simplify Phase 4c-3b 후속 — 융합·helper·주석 정리 (#1328)
- refactor(bundler): Phase 4c-3b-γ — export binding 6곳 getCanonicalByRef 전환 (#1328)
- refactor(bundler): Phase 4c-3b-β — import preamble 5곳 getCanonicalByRef 전환 (#1328)
- refactor(bundler): Phase 4c-3b-α — ImportBinding.local_symbol 필드 추가 (#1328)
- chore(bundler): /simplify Phase 4c-3 후속 — getCanonicalByRef expression switch
- refactor(bundler): Phase 4c-3 — getCanonicalByRef facade 도입 (#1328)
- chore(bundler): /simplify Phase 4c-2 후속 — populateSymbolRefCounts 중복 제거
- refactor(bundler): Phase 4c-2 — populateImportSymbols + ib.symbol 소비 전환 (#1328)
- refactor(bundler): Phase 4c-1 — Module.findExportBinding / findExportSymbol 헬퍼 추가 (#1328)
- chore(bundler): /simplify Phase 4e-2d-c 후속 — capture 이름 b → a 일관화
- refactor(bundler): Phase 4e-2d-c — SymbolRef.bundler → SymbolRef.alias rename (#1338)
- chore(bundler): /simplify Phase 4e-2d-b 후속 — Alias.span 제거
- refactor(bundler): Phase 4e-2d-b — SymbolTable → AliasTable 축소 (#1338)
- chore(bundler): /simplify Phase 4e-2d-a 후속 — semanticSymbols getter로 dedup
- refactor(bundler): Phase 4e-2d-a — dead variants + synthetic_default fallback 제거 (#1338)
- chore(bundler): /simplify Phase 4e-2c 후속 — mangler synthetic 가드 + 중복 정리
- refactor(bundler): makeInitVarName/makeExportsVarName 11개 call site → Module helper 치환 (#1338)
- refactor(bundler): wrap 모듈 init/exports 심볼을 semantic 공간에 등록 (#1338)
- refactor(semantic): synthetic_names HashMap → Symbol.synthetic_name 필드 (#1338)
- refactor(bundler): synthetic_default를 semantic 공간으로 이전 (#1338)
- refactor(semantic): synthetic_names 사이드카 맵 + extendSymbol 시그니처 확장 (#1338)
- refactor(semantic): extendSymbol API + ModuleSemanticData.symbols ArrayList 전환 (#1338)
- refactor(semantic): SyntheticKind + Symbol.synthetic_kind 필드 추가 (#1338)
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.