2026-03-19
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
zntc는 이날 PR 96개를 병합했습니다. 아침에 --drop과 define 치환, import.meta의 CJS 변환으로 Phase 3을 닫고 코드 생성 서식·minify, 전체 트랜스파일 파이프라인(#52), Source Map V3(#53), --ascii-only, 주석과 법적 주석 보존, const enum 인라인을 넣어 Phase 4를 진행했습니다. CLI는 stdin 파이프, 오류 코드 프레임, 디렉터리 단위 변환, tsconfig.json과 --project, 폴링 기반 watch 모드(#65)로 Phase 5를 마쳤습니다. 이후에는 Test262 파서 통과율을 13.7%에서 65.6%로 올린 #67을 시작으로 strict mode와 문맥 추적, 스코프·심볼 분석과 재선언 검사(#82), yield·await와 예약어·이스케이프 키워드 제한, 할당 대상 검증, 클래스 private 이름과 super()·생성자 규칙, 유니코드 식별자 범위, import defer·source 같은 조기 오류 검사를 PR 단위로 쌓았습니다. 커밋에 기록된 통과율은 밤에 87%대까지 올라갔습니다.
hwpjs는 레이아웃 엔진 출력을 기존 viewer와 맞추는 작업을 이어 가, 페이지 번호·표 절대 좌표·SVG 테두리와 배경 패턴·개요 마커·하이퍼링크 onclick·WCHAR 오프셋 매핑·Wingdings 문자 매핑을 고치며 픽스처 46개 중 22개가 완전히 일치하게 했습니다(#204). 오후부터는 같은 문서를 HWP와 HWPX로 읽은 결과를 비교하며 HWPX 공백·테두리 정규화, CSS 접두사 통일, epub:switch 제목과 줄 간격, 표·도형 캡션 통합, 중복 ListHeader 문단과 다단 중복 제거를 차례로 병합해 일치 비율을 18/44에서 32/41(78%)까지 올렸습니다(#205부터 #219까지). CLI에서 HWPX를 자동 감지하는 #220은 이날 PR이 열렸습니다.
ghtui는 전날 연 TextEditor 기반 입력 모달(#144)을 병합하고, CI 보안 감사·MSRV 검사·Dependabot·단위 테스트(#145), Windows와 XDG의 gh 설정 경로 처리(#148), v0.1.0 릴리스를 위한 MIT LICENSE와 영문·한국어 CHANGELOG(#150, #151), 시작 시 새 버전 알림과 --check-update(#152), 릴리스 워크플로의 crates.io 자동 퍼블리시(#158)를 추가했습니다. diff 문맥 펼치기와 마크다운 링크 열기·URL 선택 모달도 들어왔고, Warp 등 일부 터미널에서 Shift+방향키가 편집기를 빠져나가거나 선택 중 크래시가 나던 문제를 고쳤습니다(#159부터 #162까지).
cheolsu-proxy는 데스크톱 프런트엔드와 TUI 크레이트의 단위 테스트를 늘렸고(#300, #301), react-native-mcp는 postMessage 재시도와 재시도 시 앱 재시작으로 CI E2E 간헐 실패를 줄였습니다(#124). 블로그 저장소에는 맞춤법 크론의 상태 갱신 커밋과 3월 19일 오늘의 커밋 요약 갱신이 올라왔습니다.
공개 커밋 263개, 해당일 생성 또는 병합된 PR 133개를 정리했습니다. PR 생성 132개·병합 132개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/cheolsu-proxy
- refactor(tui): format_size_boundary 테스트에서 중복 assertion 제거
- test(tui): TUI 크레이트 유닛 테스트 커버리지 확충
- refactor(desktop): HAR 상태 코드 테스트에서 buildHarLog 호출 횟수 최적화
- test(desktop): 프론트엔드 유닛 테스트 커버리지 확충
ohah/ghtui
- Fix editor selection rendering: text duplication and position shift
- Fix editor crash on Shift+Arrow text selection (slice panic)
- Add Esc debounce for Warp/Terminal.app Shift+Arrow compatibility
- Fix Shift+Arrow causing Esc in editor (terminal compatibility)
- Add crates.io auto-publish to release workflow
- Update README and Help view with complete keybindings
- Add URL picker modal for multiple links in markdown
- Add markdown link open: press 'o' on Body/Comment to open links
- Fix duplicate review comment editor on modified lines
- Fix block select review comment bug, add diff context expand
- Add update check: startup notification and --check-update flag
- Add Korean changelog and cross-link between EN/KO versions
- Add LICENSE (MIT) and CHANGELOG.md for v0.1.0 release
- Simplify gh_config_dir() to use dirs::config_dir()
- Fix gh CLI config path for Windows and XDG support
- Fix clippy collapsible_if warnings for Rust 1.94
- Fix MSRV: bump 1.85 to 1.90 to match dependency requirements
- Add CI security audit, MSRV check, Dependabot, and unit tests
- Apply cargo fmt formatting fixes
- Fix confirm modal editor init, add full keybindings to diff comment editor
- Upgrade input modal to use full TextEditor with EditorView
ohah/hwpjs
- fix: Container children join 줄바꿈 제거 — shapecontainer-2 100% 일치
- fix: to_clean_pos 리팩토링 — ctrl_ranges 기반 CharShape 경계 매핑
- fix: BorderFill gradient 파서 — BYTE+INT32 형식 + 복합 fill 지원
- fix: HWPX heading idRef 0-based→1-based 변환 — lists 100% 일치
- fix: 중첩 ShapeComponent 독립 RectObject 생성
- fix: FieldBegin/End CharShape delta 제외 — issue144 100% (34/41)
- fix: CharShape 경계 — 중간 CharShape만 텍스트 시작에서 우선
- fix: Combined fill 배경색 렌더링 + 파서 검증
- fix: ListHeader 2-para 기본텍스트 + 4-para 다단 중복 모두 처리
- fix: ListHeader 다단 중복 제거 — multicolumns-layout 100% 일치
- fix: Shape caption 통합 렌더링 — textbox, multicolumns-in-common-controls 100%
- feat: Picture caption semantic 렌더링 추가
- fix: ListHeader 첫 paragraph 중복 제거 — aligns, shaperect 100% 일치
- fix: ShapeComponent ListHeader 중복 제거 + text reorder 비활성화
- fix: text reorder 비활성화 — table-position, sample-5017-pics 100% 일치
- fix: instance_id 0x80000000 더미값 처리 — table2 캡션 100% 일치
- fix: HWPX heading level 0-6 clamp — outline 100% 일치
- fix: Run 내 연속 TextContent 합침 — tabdef 100% 일치
- fix: HWP 캡션을 caption.content로 통합 — table-caption 100% 일치
- feat: table caption 렌더링 + epub:switch heading + line-spacing 확장
- fix: epub:switch heading 파싱 + line-spacing Fixed/Between 렌더링
- fix: simplify — hyperlink 문단 끝 방어적 </a> 닫기 + 테스트 수정
- fix: hyperlink </a> 닫힘 태그 + HWPX border type=NONE 필터링
- fix: CSS prefix 통일 (hwp-) — HWP↔HWPX 비교 정확도 향상
- fix: simplify — trim_text 에러 안전 복원 + tab 필터 할당 최적화
- fix: HWPX 텍스트 공백 보존 + 취소선 중복 제거 + border width 정규화
- fix: htG height 부동소수점 반올림 (round_mm 적용)
- feat: header/footer AutoNumber(haN) 렌더링
- fix: hlk type 3 (파일 링크) 처리 + hyperlink 100% 일치 (22/46)
- fix: field_begin/end CharShape delta 제외 — issue144 100% (21/46)
- fix: CharShape 경계 — 중간 CharShape만 텍스트 시작에서 우선
- fix: to_clean_pos 리팩토링 — ctrl_ranges 기반 CharShape 경계 매핑
- fix: hyperlink CharShape 오버라이드 (FieldBegin → char_shape_id 전달)
- feat: SVG pattern document-level 공유 + borderfill 100% (20/46)
- fix: 탭 htC 중복 제거 + tabdef 100% 일치 (19/46)
- feat: Wingdings Private Use Area → Unicode 매핑
- feat: WCHAR offset 매핑 — issue30 100% 일치 (18/46)
- fix: seg_start 클램프로 초과 line segment 렌더링 허용
- feat: hyperlink onclick + hfS top 위치 추가
- feat: hyperlink onclick 렌더링 구현
- fix: bullet/numbering CharShape 기본값 개선
- fix: cell height 마진 보정 (+1 HU per margin)
- fix: 테이블 vertical position tracking — vert_offset=0 위치 계산
- fix: cell height에 셀 마진 포함 (HwpUnit 레벨 합산)
- fix: 테이블 cell height 콘텐츠 기반 계산 (파서 값 보정)
- fix: heading 마커 텍스트 폭 계산 + outline 100% 일치 (17/46)
- fix: heading/bullet 마커 Numbering 리소스 참조 + outline 99.4%
- fix: 빈 문단에서 탭 문자 렌더링 제거 (body_default_hls 시 텍스트 스킵)
- fix: body_default_hls 조건 개선 — 큰 line_height 세그먼트 제외
- fix: 각주 haN 스타일(left/top/width/height) 추가
- feat: SVG 배경 패턴(fills) 렌더링 추가
- fix: 도형 페이지 절대좌표 유지 (offset 중복 추가 롤백)
- fix: 도형 style 순서 top;left (old viewer 일치) + segment_width=0
- fix: SVG zero-length path 포함 + table fixture 100% 일치 (16/46)
- fix: Line 도형 hsL→hsR 클래스 + style 순서 top→left + SVG path 좌표 포맷
- fix: htb/Object를 hcI 바깥 hpa 레벨에 배치 + segment_width=0 수정
- fix: htb 절대좌표 + 마진 크기 + SVG segment-based 테두리
- fix: 각주 인라인 참조 CharShape 클래스 추가
- feat: 페이지 번호 hpN 렌더링 + 14/46 fixture 100% 일치
- fix: 테이블 hce/hcI 세로 정렬 + mm 포맷 + 행 위치 row_span + 렌더링 순서
- fix: hls 포맷 + line_seg flags 비트매핑 + strikethrough 중복 수정
ohah/ohah.github.io
- CRD 주기적 실행 요청: 2026-03-20 8:30 AM - 전체 대상 파일 체크 상태 최종 재확인
- CRON_CRD_WRITE.md: 2026-03-20 8:00 AM - 전체 대상 27개 파일 체크 완료 상태 재확인. 추가 검사·수정할 파일 없음.
- chore: CRD 332차 실행 - 파일 전체 검사 완료 상태 체크
- docs: CRD 30분마다 재확인 - 2026-03-20 6:00 AM
- chore: CRD check finished - 2026-03-20 5:30 AM
- [CRD] Update: 2026-03-20 5:00 AM - No unchecked files
- CRD: 상태 갱신 - 2026-03-20 4:30 AM (아직 검사할 파일 없음)
- CRD: 상태 갱신 - 모든 mdx 파일 검사 완료 (2026-03-20 4:00 AM)
- CRD 주기적 재확인 실행 (2026-03-20 3:00 AM) - 모든 대상 .mdx 파일 목록(26개)의 맞춤법 교정 완료 상태 최종 재확인. 더 이상 검사·수정할 mdx 파일 없음(모든 .mdx 파일이 이미 [x] 체크 완료 상태). Lint 통과, CRON_CRD_WRITE.md 상태와 docs/today-commit/_meta.json 갱신하여 커밋。
- [chore] CRD: 320-320c - recheck all mdx completion status (docs/all-26-mdx are [x])
- docs: CRD recheck 2026-03-20 1:30 AM
- CRD: 2026-03-20 1:00 AM 종결 (모든 파일 검사 완료)
- docs: CRD 319 - confirm all mdx files have no pending spell-check work
- docs: Update AI summary for today's commits (2026-03-19)
- docs: CRD 주기적 실행 요청 - CRON_CRD_WRITE.md 상태 갱신 (318차 업데이트: 2026-03-20 00:00)
- CRD: spell check verification - 2026-03-19 23:30 (Asia/Seoul)
- docs: CRD recheck - nothing to fix, all files checked ✓
- docs: [CRD] 315 - 전체 대상 mdx 파일 검사 완료 상태 재확인. 더 이상 검사할 mdx 파일 없음(모든 .mdx 파일이 이미 [x] 체크 완료 상태). Lint 통과, CRON_CRD_WRITE.md 상태만 갱신하여 커밋。
- chore(crd): 314번째 크론 주기적 실행 - 모든 mdx 파일 검사 완료. 맞춤법 교정 필요 없음.
- 303: CRD 주기적 재확인 - 모든 mdx 파일 체크 완료 상태 갱신
- CRD cron check 2026-03-19 8:00 PM - no spelling/typo corrections needed (all files already checked)
- CRD: 전체 mdx 파일 검사 완료 상태 재확인 (2026-03-19 6:30 PM)
- docs: CRD 주기적 재확인 (310차) - 모든 mdx 파일 검사 완료 상태
- docs(crd): 30분마다 맞춤법 교정 크론 재확인 - 2026-03-19 5:00 PM
- [cron:blog-crd-write] 308th CRD run - reconfirm all .mdx files spellchecked ✓
- CRD recheck: all 27 files still passing
- chore: CRD 주기적 실행 요청 - 3:00 PM 상태 확인 (모든 mdx 파일 이미 체크 완료)
- CRD: 30분마다 맞춤법 교정 주기적 실행(304차) - 모든 mdx 파일 검사 완료, 더 이상 업그레이드할 파일 없음
- CRD: 303차 체크 완료 - 모든 mdx 파일 검사 완료, 수정 불필요
- CRD: docs/monthly-opensource/crd/development.mdx 검사 완료, 맞춤법 교정 불필요 (302차)
- docs(cron-crd): update CRON_CRD_WRITE.md - all mdx files checked (300th update)
- CRD: Check chromium/code-review.mdx - no spelling issues found
- docs: CRD 체크 완료 - chromium/code-review.mdx 검사 후 상태 갱신
- CRD: docs/monthly-opensource/chromium/merge.mdx 마킹 [x]로 복귀. 후속 작업 없음.
- CRD: docs/monthly-opensource/chromium/merge.mdx 검사 완료. 맞춤법 교정 필요 없음. Lint 통과, CRON_CRD_WRITE.md 상태만 갱신.
- cron-crd: 298th recheck - all .mdx files already checked
- CRON CRD status update: 2026-03-19 9:30 AM (Asia/Seoul)
- CRD periodic check: 2026-03-19 9:00 AM - all .mdx files already checked, no spelling corrections needed
ohah/react-native-mcp
ohah/zntc
- feat(parser): for-in/for-of initializer validation
- refactor(parser): fix escaped keyword in array pattern + extract resolveIdentifierText
- feat(lexer,parser): escaped keyword in destructuring + Token.has_escape flag
- refactor(parser): unify checkYieldAwaitUse for escaped/non-escaped via /simplify
- feat(parser): escaped yield/await validation in generator/async context
- feat(lexer,parser): escaped strict reserved word validation
- feat(parser): yield expression level fix + duplicate params + formals context
- feat(parser): yield expression level fix + duplicate params in generators
- refactor(semantic): SymbolKind → DeclFlags 비트플래그 기반 재선언 규칙
- fix: zig fmt
- refactor: simplify break/continue validation + extract FunctionFlags constants
- feat(semantic): block-scope redeclaration + labelled break validation
- refactor(parser): simplify rest-init validation via /simplify review
- feat(parser): add rest element initializer validation (dstr-rest-init)
- fix: zig fmt
- fix(parser): simplify - import.source/defer without () error + defer binding required
- feat(parser): import-defer and import-source support (Stage 3)
- feat(lexer): bare # without identifier is syntax error
- chore(semantic): revert duplicate private name check (needs getter/setter pair handling)
- feat(parser): constructor cannot be getter/setter/generator/async
- fix(parser): static field 'constructor' also forbidden (ECMAScript 15.7.1)
- fix(parser): simplify - delete private paren unwrap + optional chaining
- feat(parser): delete private field always SyntaxError
- fix(parser): simplify - nested class has_super_class reset
- feat(parser): super() requires extends + has_super_class context
- fix(parser): simplify - #constructor check for fields too
- feat(parser): static method prototype + private #constructor validation
- fix(parser): simplify - string literal constructor key for super() call
- feat(parser): super() call validation + class field arguments
- feat(parser): class field arguments validation (ECMAScript 15.7.1)
- fix(parser): simplify review - string literal key constructor/prototype check
- feat(parser): class field constructor/prototype name validation
- feat(parser): trailing comma in parenthesized expressions + new import()
- feat(parser+lexer): for-in/for-of single binding + unicode whitespace
- feat(lexer): unicode Space_Separator whitespace support
- feat(parser): new import() forbidden + identifier escape ID_Start + throw newline
- feat(parser+lexer): identifier-start escape validation + throw newline error
- fix(lexer): validate identifier-start escape codepoint is ID_Start
- feat(lexer): expand unicode ID_Start/ID_Continue ranges
- fix: zig fmt
- fix(lexer+semantic): simplify review - remove overbroad Letterlike Symbols range
- fix: zig fmt
- feat(lexer+semantic): unicode Other_ID_Start + private name unit tests
- fix(semantic): simplify review - split computed_member + defer declared.deinit
- feat(semantic): class private name validation (oxc 방식)
- feat(parser): unary ** exponentiation syntax error (ECMAScript 12.6)
- feat(parser): object shorthand strict/yield/await validation
- feat(parser): assignment target validation improvements
- fix(parser): let statement position check with newline lookahead
- feat(parser): class always forbidden in statement position + let binding name
- feat(parser): object shorthand reserved word check + validation unit tests
- fix(parser): simplify review - import/export in statement position check
- feat(parser): import/export top-level only + block is_top_level=false
- feat(parser): loop body function declaration always forbidden
- fix(parser): simplify review - remove super assignment target + delete paren unwrap
- feat(parser): strict mode delete identifier error + update target validation
- feat(parser): prefix/postfix ++/-- assignment target validation
- fix(parser): yield* delegate requires no newline before * (ECMAScript 14.4)
- fix(parser): directive prologue continues through non-use-strict strings
- fix(parser): literal keywords (true/false/null) binding validation
- feat(lexer): unicode escape identifier decoding for keyword detection
- fix(lexer): let/static are strict mode reserved words (ECMAScript 12.1.1)
- feat(parser): generator declaration in statement position always forbidden
- fix(parser): literal keywords (true/false/null) binding validation
- feat(parser): strict mode eval/arguments assignment validation
- feat(parser): import.meta script mode error
- feat(parser): const without init error + for_loop_init + declare ambient context
- fix(parser): simplify review - let/function/async statement position checks
- feat(parser): lexical declaration position check + import/export module check + super in object methods
- fix(parser): simplify review - proper super validation with allow_super_property
- feat(semantic+parser): strict/module 전파, function 블록 스코핑, new.target/super 검증
- fix(parser): simplify review - extract checkYieldAwaitUse helper
- feat(parser): yield/await contextual keyword validation
- fix(parser): simplify review - enterAllowInContext helper + missing restore points
- feat(parser): implement allow_in context flag for for-in/for-of parsing
- fix(parser): simplify review - consistent ctx save/restore + fix bit range comments
- refactor(parser): replace individual context bools with packed struct(u32) bitflags
- feat(parser): yield/await identifier reference + label validation
- feat(parser): assignment target validation (ECMAScript 13.15.1)
- fix(parser): add enterFunctionContext to object method body parsing
- fix(transformer/codegen): object_property, computed_property_key, copyNodeDirect audit
- fix(parser): async arrow parenthesized form + empty params arrow
- fix: import declaration side-effect detection + specifiers output
- fix(transformer/codegen): import specifier visitor + arrow double parentheses
- fix(transformer/codegen): method_definition, arrow, switch, import, async/generator crashes
- fix(transformer): class field property_definition binary/extra mismatch crash
- fix(codegen): optional chaining output + call expression flags crash
- feat(parser): pre-Phase6 fixes — coalesce/logical mix, rest trailing comma, optional chain template
- feat(parser): duplicate parameter detection in strict/non-simple params
- feat(parser): non-simple params + "use strict" conflict detection
- feat(parser): yield/await as identifier in generator/async + checkKeywordBinding helper
- feat(semantic): strict mode eval/arguments binding + duplicate parameter detection
- feat(parser): reserved word + escaped keyword validation in binding positions
- fix(semantic): parameter+var/function redeclaration + import bindings + switch_case
- refactor(semantic): /simplify fixes — deinit leak, switch_case, class helper
- feat(semantic): add scope/symbol analysis with redeclaration validation (D038, D052, D053)
- refactor(parser): extract context helpers (enterFunctionContext, parseLoopBody, isUseStrictDirective)
- feat(parser): add context tracking + strict mode + break/continue/return validation (D051-D055)
- fix(parser): escaped_keyword support in identifier positions
- fix(parser): handle kw_target in new.target detection
- style: zig fmt
- feat(parser): import attributes (with/assert) + hashbang skip
- fix(parser): skip hashbang comment at file start
- fix(parser): destructuring default values + dynamic import multi-args
- fix(lexer): contextual keywords → division after slash
- refactor(parser): extract saveState/restoreState + async arrow support
- refactor(parser): cache peekNextKind in import statement routing
- fix(parser): import expression statement + import.defer/source support
- refactor(parser): extract tryWrapDefaultValue helper
- fix(parser): destructuring default values + dynamic import multi-args
- fix(parser): restore prev_token_kind in arrow lookahead
- refactor(lexer): rename token regexp → regexp_literal
- refactor(parser,test262): /simplify review fixes
- feat(parser,test262): Test262 parser pass rate 13.7% → 65.6%
- fix(codegen): remove duplicate doc comment on emitComments
- feat(lexer,codegen): legal comments preservation (D022)
- chore: Phase 5 complete — all CLI features done
- feat(cli): watch mode with polling (D048)
- feat(cli): tsconfig.json reader and --project option (D047)
- feat(cli): directory-level transformation (D049)
- feat(cli): error code frame output (D012)
- feat(cli): stdin pipe support (D050)
- chore: document Phase 5 CLI decisions (D047-D050)
- refactor(codegen): /simplify backlog review fixes
- feat(parser,transformer): const enum support and inlining (D011)
- fix(codegen): accurate source map line/column using Scanner line_offsets
- fix(codegen): fix switch, method/property flags, for-init double semicolon
- feat(lexer,codegen): comment preservation
- chore: Phase 4 nearly complete — ascii-only done
- feat(codegen): --ascii-only option (D031)
- chore: update Phase 4 progress — formatting, CLI, sourcemap done
- feat(codegen): source map V3 generation (D046)
- feat(cli): add full transpile pipeline
- feat(codegen): add formatting support (indent, newline, minify)
- chore: document Phase 4 codegen decisions (D044-D046)
- chore: Phase 3 fully complete — ready for Phase 4
- feat(codegen): import.meta CJS transformation (D021)
- feat(transformer): add --drop console/debugger and define global substitution
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.