2026-06-23
요약 (AI 작성)
maru의 유니코드 텍스트 처리(grapheme cluster)를 근본적으로 넣은 날입니다(69커밋). UAX#29 기반 한글 grapheme 분절 순수 함수(HG1)에서 출발해, 셀 다중 코드포인트 저장과 NFD 한글 cluster producer·무손실 직렬화(HG2), CoreText 셰이퍼에 cluster 전체 전달(HG3a)과 Cell.combining 제거(HG3b)로 이어졌고, emoji ZWJ 시퀀스(GB11)·키캡을 클러스터 경로로 통합했습니다. grapheme_store dedup(link_ids 패턴)으로 반복 cluster의 per-cell 증가도 차단했습니다. 이 밖에 사이드바가 접혀도 알림 종·배지를 최소 폭에 유지하도록 다듬었습니다.
커밋
ohah/maru
- refactor(terminal): Screen struct 신설 + 활성 grid fold (방향 B-min B1)
- docs(grapheme): §11 B 불가에 맞춰 page-local 회수 보류로 정정·정합
- docs(terminal): §11.9 P4 설계(mmap backing for 스크롤백 page arena)
- fix(grapheme): 리뷰 후속 — dedup 해시 계약·색 회귀·emoji 클러스터 엣지 3건
- refactor(terminal): 스크롤백 cell arena를 mmap page_allocator로 backing (§11 P4)
- docs(terminal): §11.10 full-B 설계(활성 grid 통합 PageList·다단계)
- fix(terminal): setScrollbackArena assert가 pool 페이지까지 검사 (§11 P4 리뷰 후속)
- docs(terminal): §11 종료 — full B는 A2와 구조적 충돌로 불가, A1/A2/P4로 완성 정정
- refactor(terminal): 커서 이동/위치를 screen.zig로 (core.zig 분할 12/N — Phase C 시작)
- feat(sidebar): 접힘에도 알림 종 유지 + 최소 폭에 종/배지 포함
- refactor(terminal): scroll/feed(LF·SU/SD·IL/DL·DECSTBM·DECALN)를 screen.zig로 (core.zig 분할 14/N)
- refactor(terminal): print 핫패스(writeCodepoint·putCell)를 screen.zig로 (core.zig 분할 16/N)
- refactor(terminal): resize/reflow를 screen.zig로 (core.zig 분할 17/N)
- refactor(terminal): snapshot/viewport 합성을 screen.zig로 (core.zig 분할 18/N — Phase C 완료)
- docs(terminal): 배치1 /code-review max 후속 — parser.zig 모듈 doc·분해 현황표 정합성 (분할 5~11/N 리뷰)
- refactor(terminal): alt screen + 커서 저장/복원을 screen.zig로 (core.zig 분할 15/N)
- refactor(terminal): 배치2 /code-review max 후속 — pub 최소화·stale 주석·분해 현황표 (분할 12~18/N 리뷰)
- refactor(terminal): SGR + 모드 dispatch를 parser.zig로 (core.zig 분할 19/N — Phase D 시작)
- refactor(terminal): write 상태기계(feed) + escape/UTF-8을 parser.zig로 (core.zig 분할 21/N — 분해 완결)
- docs(terminal): 분해 doc·모듈 헤더를 실제 코드·완결 상태와 정합(SSOT 점검 후속)
- refactor(terminal): erase/insert/delete를 screen.zig로 (core.zig 분할 13/N)
- docs(terminal): 배치3 /code-review max 후속 — parser/core 주석·분해 완결 doc 정합성 (분할 19~21/N 리뷰)
- refactor(terminal): 스크롤백 저장·재-wrap을 screen.zig로 (core.zig 분할 11/N — Phase B 완료)
- refactor(terminal): CSI 상태기계(handleCsiByte·dispatchCsi)를 parser.zig로 (core.zig 분할 20/N)
- refactor(terminal): selection.zig 분리 /code-review max 후속 cleanup (S1~S5 리뷰)
- refactor(terminal): kitty.zig 분리 /code-review max 후속 cleanup (K1~K3 리뷰)
- fix(terminal): 빈(len-0) 스크롤백 행에서 단어/URL 선택 OOB 가드 (§11 A2 리뷰 후속)
- docs(grapheme): preedit는 codepoint 단위(의도) — HG3/HG4 cluster 약속 정정
- feat(terminal): emoji ZWJ 시퀀스(GB11) + emoji 클러스터 경로 통합
- docs(terminal): §11.7 A2 설계 정제 — arena 고정-크기·soft 행 비-trim (구현 전 발견)
- docs(grapheme): grapheme의 page-local 귀속 결정·플랜 박기(§11.8) — 활성 grid 페이징 B에서
- refactor(terminal): 스크롤백 행 가변폭/trailing-trim — per-row-descriptor arena (§11 A2)
- feat(terminal): HG1 — 한글 grapheme cluster 분절 순수 함수(UAX#29 GB6/7/8/9)
- refactor(terminal): 활성 스크롤백 sb를 Screen에 fold (방향 B-min B2)
- refactor(terminal): alt 화면을 saved_screen struct swap으로 — B-min 완결 (방향 B-min B3)
- refactor(terminal): B-min /code-review max 후속 cleanup (B1~B3 리뷰)
- refactor(terminal): B4~B5 /code-review max 후속 cleanup — resize 헬퍼·activeSavedCursor 인라인 (분할 B6)
- refactor(terminal): DECSC 저장 슬롯을 화면에 귀속(per-screen saved_cursor) (core.zig 분할 B5 — Option 3)
- feat(terminal): HG2b — 다중 combining·키캡을 grapheme_store에 무손실 누적
- docs(grapheme): HG2b를 순수 Zig 저장 이전으로 좁히고 ABI·hack 제거를 HG3로 이관
- refactor(terminal): 커서를 화면에 귀속(per-screen cursor)·alt 통째 swap (core.zig 분할 B4 — Option 3)
- feat(terminal): HG2a 무손실 직렬화 — selection 복사·observability snapshot
- feat(terminal): HG2a 셀 다중 코드포인트 저장 + NFD 한글 cluster producer
- docs(grapheme): HG2a를 append-only 무손실 저장으로 정정, id 회수는 refcount 후속 분리
- fix(terminal): NFD cluster 흡수를 conjoining 자모(U+1100~U+11FF)로 한정
- feat(renderer): HG3a — CoreText 셰이퍼에 grapheme cluster 전체 전달(NFD 한글 합성)
- fix(terminal): RIS(ESC c)가 DECSC 저장 슬롯도 공장 초기화
- docs(terminal): §11 page-aligned storage 설계·결정(C: 측정→A→게이트 B)
- refactor(terminal): 검색·추출·preedit를 selection.zig로 — selection 분리 완결 (S5)
- refactor(terminal): 스크롤백 절대행 accessor(absRow·absRowWrapped)를 screen.zig로 (selection 분리 S1 — 11b/N)
- fix(notifications): caret를 단일 surface_bg 삼각형으로 + 접힘 헤더 종↔◧ 순서 고정
- fix(renderer): rich quad sRGB 역감마 지수 3.0→2.4 (모달/quad 색이 테마 토큰대로 렌더)
- refactor(terminal): selection.zig 신설 + 선택/검색/URL 순수 leaf 12개 이동 (selection 분리 S2)
- refactor(terminal): word-bounds + 포인터 선택을 selection.zig로 (selection 분리 S3)
- refactor(terminal): URL 감지(urlAnchorAt·urlSpanAtAbs·extractUrlAt·wordIsUrl)를 selection.zig로 (selection 분리 S4)
- refactor(terminal): 입력/이벤트 host 인코딩을 input_report.zig로 (R1)
- fix(build): .app 자체 공증·staple로 타 맥 '손상' 방지 + dmg 마운트 detach 가드
- refactor(terminal): input_report.zig /code-review max 후속 — reportMouse doc dedup (R1 리뷰)
- refactor(terminal): kitty.zig 신설 + graphics struct 4개 + leaf 8개 이동 (kitty 분리 K1)
- refactor(terminal): kitty storage/evict mid를 kitty.zig로 (kitty 분리 K2)
- refactor(terminal): kitty orchestrator를 kitty.zig로 — kitty 분리 완결 (K3)
- docs(grapheme): 설계를 B 저장 방식·기존 combining 통합·입력 경로 일관성으로 최신화
- docs(grapheme): 한글 NFD conjoining 자모 grapheme cluster 렌더링 정공법 설계 문서 신설
- docs(terminal): §11 A2 설계(가변폭/trailing-trim) + setup-path OOM 누수 후속 등재
- feat(terminal): HG3b — Cell.combining 제거(pure-B) + 단일-combining hack 3곳 제거
- test(terminal): HG4 — NFD 한글 recorded-oracle fixture + 검증 매트릭스 갱신
- refactor(terminal): 스크롤백을 page 저장으로(per-row ring → page+pool) — §11 A1
- fix(terminal): rewrap commit을 OOM-트랜잭션으로 — 옛 스크롤백 보존 (§11 A1 리뷰 후속)
- perf(terminal): grapheme_store dedup (link_ids 패턴) — 반복 cluster per-cell 증가 차단
ohah/zntc
- ci: integration 잡별 path 필터 + draft PR skip (PR-A)
- fix(cache): #4438 디스크 캐시 견고성 후속 — LOW 4건 + 버전별 GC
- fix(cache): #4438 디스크 캐시 ON==OFF 감사 후속 3건 (진단 누락 / .d.ts 키 / import.meta)
- ci: PR 에선 무거운 매트릭스 축소, push(main)는 풀 매트릭스 (PR-B)