2026-03-22
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
zntc 번들러는 오전에 트리 셰이킹을 진행했습니다. 쓰이지 않는 export를 모듈 단위로 지우는 1단계(#238)에 이어, 호출·new 노드의 플래그를 extra_data로 옮겨 @__PURE__ 주석을 담고(#239), package.json의 sideEffects와 순수성 분석을 적용했으며(#240), esbuild·rolldown처럼 순수 모듈을 자동 판정하게 했습니다(#241). @__NO_SIDE_EFFECTS__는 @__PURE__와 분리해 호출 지점에 반영하고 모듈 간으로 전파했습니다(#242, #243, #245). JSX 자기 닫는 태그가 >를 먼저 소비해 형제 요소를 깨뜨리던 렉서 버그도 고쳤습니다(#244).
오후에는 CJS 모듈 감지와 require() 스캔, __commonJS 래핑, __toESM 브리지로 CJS 상호 운용을 넣고(#248부터 #250까지) Top-Level Await 감지와 전파를 추가했습니다(#251). 이어 코드 분할을 청크 그래프 타입, 청크 간 의존성 추적, 다중 파일 emitter와 CLI --splitting, 심볼 단위 청크 간 import·export와 동적 import 경로 재작성, 청크별 scope hoisting, content hash와 import 중복 제거 순으로 구현했습니다(#252부터 #258까지).
저녁부터는 Bun 모노레포와 통합·E2E 테스트 환경, oxlint·oxfmt 설정(#259)을 갖추고 개발 서버와 HMR을 만들었습니다. 정적 파일 서버, 실시간 번들 서빙, WebSocket HMR 채널, 파일 감시와 전체 새로고침, 모듈 그래프 전체 감시, 에러 오버레이까지 6단계(#260부터 #267까지)와 SPA 폴백(#269)을 병합했고, TS non-null 단언 체이닝 파싱도 고쳤습니다(#265). 이후 import.meta.hot용 모듈 래핑 dev 번들과 HMR 런타임(#270), 바뀐 모듈만 보내는 업데이트(#271), dev 번들 소스맵 서빙(#272), React Fast Refresh의 $RefreshReg$·$RefreshSig$ 주입과 런타임 통합(#273, #274, #276), 새로고침 없는 CSS 핫 리로드(#275)가 들어왔습니다. esbuild·SWC·oxc·webpack·rspack·rolldown과 비교하는 벤치마크 스위트 #277은 이날 PR이 열렸습니다.
cheolsu-proxy는 네트워크 테이블을 TanStack Table로 옮기면서 요청 시각 컬럼, 디바이스 종류와 로컬·원격 클라이언트 표시, 쿼리 필터 편집기 개선, 트래픽 분석의 Invalid Date와 다른 형식으로 복사 버그 수정, pre-commit 훅을 함께 넣었습니다(#318). 컨텍스트 메뉴의 규칙 추가 옵션 확장과 다이얼로그 패턴 통일(#319), Quick Settings의 Block QUIC(Alt-Svc 제거) 옵션(#320)도 병합됐습니다. 블로그 저장소에는 맞춤법 크론의 상태 갱신 커밋(hwpjs 개발기 5편 확인 포함)과 3월 22일 오늘의 커밋 요약 작성이 올라왔습니다.
공개 커밋 159개, 해당일 생성 또는 병합된 PR 43개를 정리했습니다. PR 생성 43개·병합 42개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/cheolsu-proxy
- feat: Quick Settings에 Block QUIC 옵션 추가
- refactor(desktop): 코드 리뷰 피드백 반영
- feat(desktop): 컨텍스트 메뉴에 규칙 추가 옵션 확장 및 다이얼로그 패턴 통일
- fix(desktop): 고급 반복 모달에서 긴 URL이 레이아웃을 깨뜨리는 버그 수정
- fix(desktop): 다른 형식으로 복사 기능이 동작하지 않는 버그 수정
- feat(desktop): 네트워크 테이블에 요청 시각(Timestamp) 컬럼 추가
- fix(desktop): 클라이언트 셀을 로컬/원격 구분으로 변경
- chore: pre-commit 훅 추가 (Rust 포맷, JS/TS 린트/포맷, i18n 동기화 체크)
- chore(desktop): i18n 카탈로그 줄 번호 업데이트
- refactor(desktop): 코드 리뷰 피드백 반영
- chore(desktop): i18n 카탈로그 업데이트
- refactor(desktop): 네트워크 테이블을 TanStack Table로 마이그레이션
- test(desktop): 네트워크 테이블 핵심 로직 유닛 테스트 추가
- feat(desktop): 네트워크 테이블에서 모바일/태블릿/데스크톱 디바이스 구분 표시
- feat(desktop): 쿼리 필터 에디터 UX 개선
- fix(desktop): 트래픽 분석 탭에서 시간이 Invalid Date로 표시되는 버그 수정
ohah/ohah.github.io
- chore(cron): CRD spell check round 8 completed, all files verified
- CRON_CRD_WRITE.md: ✅ 340-i-jeong-cha-ga-bu-yeok-cha-jeong-ja-7 completed March 23 08:00 AM
- 340-i-jeong-cha-ga-bu-yeok-cha-jeong-ja-6 - 2026-03-23 07:30 AM (Asia/Seoul) - CRD 주기적 실행 (현재)
- CRD: final verification reconfirmations (340-chi-cha-gyeong-cha-jeong-ja, 340-jjik-cheong-gyeong-chul, plus consolidated 340-a and 340-g)
- Update CRON_CRD_WRITE.md: CRD reconfirmation (all files already [x] checked)
- crd: re-verify docs/monthly-opensource/crd/development-1.mdx (no changes, lint ok)
- CRD 주기적 실행: 전체 대상 mdx 파일 검사 완료 상태 재확인 (모든 파일 [x] 체크된 상태)
- docs: Add summary for 2026-03-22 activity, verified all checks complete
- CRD 자기 갱신: 2026-03-23 12:00 AM - 전체 mdx 파일 검사 완료 상태 확인 후 커밋
- CRD: 340-i-jeong-cha-ga-bu-yeok-cha-jeong-ja-3 - 전체 .mdx 파일 재확인 및 상태 갱신 완료
- docs: update CRON_CRD_WRITE.md - all mdx files checked [x] (342)
- docs: 2026-03-21 커밋 요약 및 CRD 상태 자기 갱신
- CRD reconfirm: all 26 mdx files checked [x]
- CRD: 2026-03-22 8:30 PM periodic reconfirmation - all files already checked [x] / no changes needed
- docs: 2026-03-21 요약 작성 (CRD 검사 완료, zts/cheolsu-proxy 진행상황)
- CRD: docs/monthly-opensource/craby/background.mdx 재검사, 맞춤법 교정 없음
- docs: mark docs/monthly-opensource/hwpjs/development-5.mdx as checked
- CRD re-check: docs/monthly-opensource/craby/background.mdx verified (no corrections needed)
- 340-eum-cheong-cha-gyeong-cha-3: CRD 주기적 실행 완료 (2026-03-22 4:00 PM)
- CRD re-confirmation: 2026-03-22 3:00 PM - all 27 files verified [x] complete
- CRD: 2026-03-22 2:30 PM - 모든 mdx 파일 재확인, CRON_CRD_WRITE.md 자기 갱신
- CRD: 2026-03-22 2:00 PM - 전체 mdx 파일 재확인 완료, 추가 검사 파일 없음
- 340-ha-eum-cheong-gyeong-cha-2 - 2026-03-22 1:30 PM (Asia/Seoul) - CRD 자기 갱신 전체 대상 27개 재확인 체크 완료 상태
- CRD: 전체 mdx 파일 상태 재확인 완료 - all [x]
- CRD: 전체 mdx 파일 맞춤법 교정 완료 상태 재확인 (2026-03-22 12:30)
- CRD: 2026-03-22 11:30 AM verification - all files already checked
- CRD: 2026-03-22 10:30 AM final verification - all .mdx files checked
- CRD: docs/monthly-opensource/hwpjs/development-5.mdx 검사 완료. 맞춤법/띄어쓰기 교정 필요 없음.
- Recheck all mdx files - all already checked (no changes)
ohah/zntc
- test(e2e): React Fast Refresh 코드 주입 + /@react-refresh 엔드포인트 E2E
- feat(transformer): $RefreshSig$ 바인딩 정보 포함 (oxc/Babel 동일)
- refactor: /simplify — React.useState 감지, use() 지원, dead code 제거
- feat(transformer): $RefreshSig$ Hook 시그니처 주입
- fix: CI E2E 수정 (openDir iterate + timeout) + CLAUDE.md HMR 완성 기록
- refactor: /simplify — realpathAlloc 루프 밖으로 호이스트
- feat(server): CSS 핫 리로드 — link tag swap + E2E 테스트
- feat(server): /@react-refresh 가상 엔드포인트 (Vite 방식)
- fix: require→window.REACT_REFRESH_RUNTIME + concat 최적화
- docs: update CLAUDE.md — React Fast Refresh 완료 기록
- feat(server): React Fast Refresh 런타임 통합 — 글로벌 바인딩 + hot.accept 자동 삽입
- refactor: /simplify — _c=App 순서 수정, dead state 제거, addString 중복 제거
- feat(transformer): React Fast Refresh — $RefreshReg$ 컴포넌트 등록 주입
- docs: update CLAUDE.md — import.meta.hot/소스맵 서빙 완료 기록
- test(e2e): 파일 변경 시 HMR update 메시지 수신 E2E 테스트
- test(e2e): 소스맵 서빙 E2E 테스트 추가
- refactor: /simplify — race condition 수정, dead code 제거, comptime 최적화
- feat(server): 소스맵 서빙 — dev 번들 V3 소스맵 생성 + /bundle.js.map 엔드포인트
- fix(server): HMR update 폴백 — __zts_apply_update 없으면 full-reload
- fix: CI 빌드 에러 + /simplify — double transform 제거, 경로 매칭 안전성
- feat(server): HMR 모듈 단위 업데이트 — 변경 모듈만 WS로 전송
- refactor: /simplify — dead code 제거, skip_nodes 헬퍼 추출, 들여쓰기 최적화
- feat(server): import.meta.hot dev 번들 — 모듈 래핑 + HMR 런타임 (D060)
- docs: D060 의사결정 — import.meta.hot 모듈 래핑 dev 번들 방식 채택
- docs: update CLAUDE.md — 에러 오버레이/SPA 폴백 완료 + 소스맵 이슈 기록
- feat(server): SPA 폴백 (historyApiFallback)
- test(e2e): 에러 오버레이 E2E 테스트 추가
- fix(server): /simplify — XSS 방지 + comptime 빈 슬라이스 free 수정
- feat(server): 에러 오버레이 + CLAUDE.md 진행 상황 업데이트
- docs: update CLAUDE.md — dev server 진행 상황 + 남은 작업 정리
- fix(server): /simplify — mtime_map dangling pointer 수정 + cleanup 정리
- feat(server): 모듈 그래프 전체 파일 감시 (HMR 5/6단계)
- fix(parser): TS non-null assertion 체이닝 수정 (foo()!.bar)
- style(e2e): oxfmt 포맷 적용
- test(e2e): E2E 테스트 활성화 — dev server 검증
- refactor(server): /simplify — 스택 축소 + dead client 정리 + TODO
- feat(server): thread-per-connection + watch → full-reload (HMR 4/6단계)
- refactor(server): /simplify — WHAT 주석 제거 + _ = self 정리
- feat(server): WebSocket HMR 채널 (HMR 3/6단계)
- refactor(server): /simplify — 번들 서빙 코드 정리
- feat(server): on-the-fly 번들 서빙 (HMR 2/6단계)
- fix(server): Windows 빌드 수정 — comptime stderr 제거
- feat(server): HTTP 정적 파일 서버 (HMR 1/6단계)
- docs: update CLAUDE.md — HMR 의사결정 반영 (D056-D058)
- feat: oxlint + oxfmt 설정 추가
- refactor: /simplify — helpers.ts 리팩터링 + ci.yml 중복 제거
- feat: Bun 모노레포 셋업 + 통합/E2E 테스트 환경 구축
- docs: update CLAUDE.md — HMR 선행 작업 (Bun 모노레포) 반영
- docs(bundler): /simplify — bits_to_chunk aliased pointer 주석 추가
- perf(bundler): BitSet→ChunkIndex HashMap for O(1) chunk lookup
- fix(bundler): /simplify — entry module 재할당 시 이전 청크에서 제거
- docs: update CLAUDE.md — chunk optimizations 반영 (PR #258)
- fix(bundler): /simplify — chunkStem hash determinism
- feat(bundler): chunk optimizations — content hash + import dedup
- docs: update CLAUDE.md — code splitting 완료 반영
- docs(bundler): /simplify — TODO for duplicate cross-chunk import deconfliction
- test(bundler): add 5 code splitting edge case tests
- fix(bundler): cross-chunk import/local name collision — occupied names deconfliction
- feat(bundler): per-chunk scope hoisting + cross-chunk export alias
- feat(bundler): dynamic import path rewriting for code splitting
- fix(bundler): /simplify — import 심볼 정렬 + rename TODO 문서화
- feat(bundler): symbol-level cross-chunk import/export
- docs: update CLAUDE.md — CJS/TLA/Code splitting 완료 반영
- fix(bundler): /simplify — entry module을 항상 엔트리 청크에 배정
- feat(cli): --splitting flag for code splitting
- fix(bundler): /simplify — chunk filename collision + CJS format guard + tests
- feat(bundler): multi-file emitter + BundleResult update + pipeline integration (code splitting PR4)
- fix(bundler): /simplify — silent continue → debug assert for out-of-bounds module
- feat(bundler): computeCrossChunkLinks — cross-chunk dependency tracking
- test(bundler): add 5 more generateChunks edge case tests
- fix(bundler): /simplify — memory safety + O(n) queue fix
- feat(bundler): generateChunks Phase 1~3 — entry init + reachability + chunk assignment
- docs(bundler): /simplify — BitSet/Chunk 주석 보강
- feat(bundler): BitSet + Chunk + ChunkGraph types for code splitting
- style: apply zig fmt
- refactor(bundler): TLA 감지를 semantic analyzer로 이동 (oxc 패턴)
- style: apply zig fmt
- fix(bundler): /simplify — containsAwait 정확성 + for_await_of_statement 태그
- feat(bundler): Top-Level Await detection, propagation, and validation
- test(bundler): add 4 CJS interop edge case tests
- fix(bundler): /simplify — require() overrides ESM promotion (esbuild 동작)
- feat(bundler): __toESM bridge + ExportsKind promotion
- fix(bundler): /simplify — memory leak fix + tests + caching
- feat(bundler): CJS wrapping with __commonJS runtime helper
- fix(parser): module.exports parsed as expression, not TS namespace
- refactor(bundler): /simplify — extract getAssignMemberParts, use ast.getText
- feat(bundler): CJS module detection + require() scanning
- docs: update CLAUDE.md with Phase B2 roadmap
- test(bundler): add 8 real-world integration tests + update CLAUDE.md
- fix(bundler): /simplify — async function @NO_SIDE_EFFECTS 전파 버그 수정
- style: apply zig fmt
- feat(bundler): cross-module @NO_SIDE_EFFECTS propagation
- test(bundler): add 8 more JSX complex pattern tests
- test(bundler): add 5 JSX sibling/nesting regression tests
- fix(lexer): JSX self-closing /> was consuming > prematurely — broke sibling elements
- refactor(semantic): change ast from *const Ast to *Ast — remove @constCast
- refactor(semantic): /simplify — use readExtra helpers + O(1) symbol_ids lookup
- feat(semantic): consume @NO_SIDE_EFFECTS flag — auto-set is_pure on calls
- test(lexer): add @NO_SIDE_EFFECTS test cases
- fix(lexer): add #NO_SIDE_EFFECTS variant (parity with #PURE)
- feat(lexer): separate @NO_SIDE_EFFECTS from @PURE annotation
- feat(tree-shaker): activate auto-pure module detection (esbuild/rolldown behavior)
- perf(graph): cache package.json sideEffects per package directory
- feat(tree-shaker): fix pure analysis bugs + JSX semantic traversal + namespace include
- feat(tree-shaker): add isModulePure/isStatementPure/isExpressionPure analysis functions
- feat(bundler): auto-apply package.json sideEffects to module.side_effects
- refactor(ast): extract readExtra/readExtraNode/hasExtra helpers, unify bounds checks
- fix(parser): /simplify — fix @PURE leak on optional chain call, clean up imports
- docs: update D082 with converted node list and inline/extra_data rules
- refactor(ast): convert 6 node types to extra_data for consistent flag extensibility (D082)
- feat(parser): convert call/new to extra_data + @PURE annotation support (D082)
- docs: add D082 — per-node flags strategy (extra_data for @PURE)
- refactor(tree-shaker): /simplify review — fix doc comment, optimize isImportBindingUsed
- feat(bundler): add tree-shaking phase 1 — module-level unused export removal
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.