2026-06-09

날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.

요약 (AI 작성)

maru는 dev shell이 실제 터미널처럼 보이도록 렌더링을 다듬는 데서 시작했습니다. 셀 전경색과 SGR 배경색 칠하기(#165, #172), 공통 baseline 정렬(#166), 실제 폰트 메트릭과 Retina HiDPI, 번들 폰트(#167)가 들어왔고, idle tick에서 CoreText shaping을 건너뛰며(#171) grid 계산을 Swift에서 Zig로 옮겼습니다(#170, #173). 터미널 코어에는 DECAWM autowrap(#175), 콜론 형식 확장색 SGR(#169), 반전 블록 커서(#182)가 추가됐습니다. resize reflow는 한 번 넣었다가(#184) Ghostty libghostty-vt 비교 oracle(#187)을 만든 뒤 되돌리고(#188), 스크롤백 ring buffer와 뷰포트, 렌더, 휠·Shift+PageUp/Down 입력(#190부터 #193까지)을 먼저 깐 다음 soft-wrap 추적과 활성 화면 reflow(#194, #195)로 다시 들어왔습니다. 라이브에서 좁은 폭의 프롬프트가 겹치던 문제는 DSR·CPR 응답 경로(#196), 드래그 끝에 한 번만 resize 적용(#198), TERM=xterm-256color 지정(#199), 커서가 있는 줄은 reflow하지 않는 방식(#200)으로 정리했습니다. PR에서도 성능 예산을 돌리도록 CI를 바꿨습니다(#189).

후반에는 TUI 지원을 넣었습니다. scroll region(DECSTBM, #206), alternate screen(#207), application cursor keys(#208), alt screen에서 휠을 화살표로 바꾸는 alternate scroll(#209), IL·DL과 커서 표시·reverse video(#212), DECSC·DECRC와 DA1(#214)이 들어왔고, glyph가 많은 출력에서 atlas 좌표가 바닥나 글자가 깨지던 문제를 atlas 재활용으로 고쳤습니다(#213, #217). 누적 리뷰 반영(#215부터 #219까지) 뒤에는 resize 때 스크롤백 행 재배치(#220)와 스크롤 위치 고정(#221), DECSCUSR 커서 모양(#222), 마우스 선택과 Cmd+C 복사(#223), 더블·트리플 클릭 선택(#224), bracketed paste를 지원하는 Cmd+V(#225)까지 병합됐습니다. Cmd+클릭으로 URL을 여는 #226은 이날 PR이 열렸습니다.

suji는 모바일 e2e 하니스를 여러 변형에서 견고하게 만들고 rust·go·multi Android 변형에 gradlew 래퍼를 커밋했습니다(#136, #137). 새 플러그인으로 창 bounds·최대화 상태를 저장·복원하는 window-state(#138), 창을 화면·트레이·커서 위치에 놓는 positioner(#139), multipart 업로드와 디스크 다운로드를 하는 upload(#140)를 추가했고, 큰 IPC 페이로드가 잘리던 문제를 청크 분할과 동적 버퍼로 고쳤습니다(#141). 블로그 저장소에는 Craby 배경 문서의 어조 수정, 오늘의 커밋 요약, 크론이 만든 교정 커밋이 올라갔습니다.

공개 커밋 71개, 해당일 생성 또는 병합된 PR 68개를 정리했습니다. PR 생성 68개·병합 67개는 같은 PR이 양쪽에 포함될 수 있습니다.

커밋

ohah/maru

ohah/ohah.github.io

ohah/suji

PR (해당일 생성/머지)

상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.

저장소PR해당일 활동상태대상 브랜치제목
ohah/maru#226생성mergedmainfeat(terminal,platform): Cmd+click opens the URL under the cursor (ABI v16)
ohah/maru#225생성 · 병합mergedmainfeat(terminal,platform): Cmd+V paste with newline normalization and bracketed paste (ABI v15)
ohah/maru#224생성 · 병합mergedmainfeat(terminal,platform): double-click word and triple-click line selection (ABI v14)
ohah/maru#223생성 · 병합mergedmainfeat(terminal,platform): mouse selection and Cmd+C clipboard copy (ABI v13)
ohah/maru#222생성 · 병합mergedmainfeat(terminal,platform): cursor shapes via DECSCUSR (block/underline/bar, ABI v12)
ohah/maru#221생성 · 병합mergedmainfix(terminal): keep the scrolled-back view anchored across resize (Ghostty pin semantics)
ohah/maru#220생성 · 병합mergedmainfeat(terminal): re-wrap scrollback rows to the new width on resize (deferred)
ohah/maru#219생성 · 병합mergedmainrefactor(terminal,tests): n-aware scroll range, merged 47/1047 arm, shared oracle case manifest
ohah/maru#218생성 · 병합mergedmainfix(terminal,platform): ED 3 clears scrollback, page-scroll works in alt screen, batched alternate scroll
ohah/maru#217생성 · 병합mergedmainfix(renderer): rebuild the glyph frame when the atlas invalidates mid-build
ohah/maru#216생성 · 병합mergedmainfix(terminal): wrap links at scroll-range boundaries, EL/ED pending-wrap, parser kept across resize
ohah/maru#215생성 · 병합mergedmainfix(terminal): per-screen DECSC slots, unconditional 1049 save/restore, atomic alt enter
ohah/maru#214생성 · 병합mergedmainfix(terminal): DECSC/DECRC cursor save-restore (ESC 7/8) and DA1 identification
ohah/maru#213생성 · 병합mergedmainfix(renderer): recycle the glyph atlas when row-packer coordinates run out
ohah/maru#212생성 · 병합mergedmainfeat(terminal): IL/DL line edits, cursor visibility (DECTCEM), and SGR reverse video
ohah/maru#211생성 · 병합mergedmaintest: close coverage gaps from recent PRs (escapeForLog, scrollPage, EnvStorage, viewport frame)
ohah/maru#210생성 · 병합mergedmaindocs: fixed-cell pixel layout is already implemented (#162) — fix stale NDC-inset notes
ohah/maru#209생성 · 병합mergedmainfeat(platform): alternate scroll converts wheel to arrows in the alt screen (DECSET 1007)
ohah/maru#208생성 · 병합mergedmainfeat(input): application cursor keys (DECCKM) switch arrows between CSI and SS3
ohah/maru#207생성 · 병합mergedmainfeat(terminal): alternate screen (DECSET 1049/47/1047/1048)
ohah/maru#206생성 · 병합mergedmainfeat(terminal): scroll region (DECSTBM) with margin-confined LF/IND/RI
ohah/maru#205생성 · 병합mergedmaindocs: sync plan/matrix with scrollback, DSR/CPR, and real resize metrics
ohah/maru#204생성 · 병합mergedmainrefactor(platform): move scroll delta/page conversion from Swift into Zig (ABI v11)
ohah/maru#203생성 · 병합mergedmainfix(platform): guard scroll-delta conversion, page-size fallback, wide-glyph cursor overlay
ohah/maru#202생성 · 병합mergedmainfix(app): clamp debug-log ellipsis, build frames from renderSnapshot, drop dead EnvStorage branch
ohah/maru#201생성 · 병합mergedmainfix(terminal): correct reflow scratch bound, EL mode-1 wrap flag, scrollback wide-glyph clip
ohah/maru#200생성 · 병합mergedmainfix(terminal): do not reflow the cursor's line on resize (xterm.js approach)
ohah/maru#199생성 · 병합mergedmainfix(pty): set TERM=xterm-256color for the spawned shell instead of inheriting
ohah/maru#198생성 · 병합mergedmainfix(platform): apply grid resize once at end of live drag, not every step
ohah/maru#197생성 · 병합mergedmaindebug(app): log PTY-output control sequences under MARU_DEBUG
ohah/maru#196생성 · 병합mergedmainfeat(terminal): answer DSR/CPR cursor-position queries over a write-back path
ohah/maru#195생성 · 병합mergedmainfeat(terminal): reflow the active screen on resize, overflow into scrollback
ohah/maru#194생성 · 병합mergedmainfeat(terminal): track soft-wrap per active row and per scrollback row
ohah/maru#193생성 · 병합mergedmainfeat(platform): scroll the scrollback viewport via wheel and Shift+PageUp/Down
ohah/maru#192생성 · 병합mergedmainfeat(terminal): render the scrollback viewport via renderSnapshot
ohah/maru#191생성 · 병합mergedmainfeat(terminal): add scrollback viewport offset and scroll API
ohah/maru#190생성 · 병합mergedmainfeat(terminal): store scrolled-off rows in a scrollback ring buffer
ohah/maru#189생성 · 병합mergedmainci(performance): run the perf budget on pull requests
ohah/maru#188생성 · 병합mergedmainrevert(terminal): restore copy-region resize, defer reflow until scrollback
ohah/maru#187생성 · 병합mergedmaintest(oracle): compare resize reflow against Ghostty libghostty-vt
ohah/maru#186생성 · 병합mergedmainfix(terminal): preserve blanks up to the cursor during reflow
ohah/maru#185생성 · 병합mergedmaindebug(platform): show soft-wrap flags in the MARU_DEBUG screen dump
ohah/maru#184생성 · 병합mergedmainfeat(terminal): reflow soft-wrapped lines on resize
ohah/maru#183생성 · 병합mergedmaintest(terminal): harden coverage for wrap edges, colon SGR, cursor projection, packing
ohah/maru#182생성 · 병합mergedmainfeat(platform): render the inverted block cursor and sync dev-shell docs
ohah/maru#181생성 · 병합mergedmainchore(platform): dedup MARU_DEBUG gate, fix resize counter, refresh boundary doc
ohah/maru#180생성 · 병합mergedmainfix(platform): enable premultiplied blending and project BCE backgrounds for blank cells
ohah/maru#179생성 · 병합mergedmainfix(app): enforce min 2-column grid at the PTY winsize boundary
ohah/maru#178생성 · 병합mergedmainfix(terminal): clear pending wrap on scroll-LF and parse colorspace-less colon SGR
ohah/maru#177생성 · 병합mergedmainrefactor(terminal): enforce min 2 columns and drop the wide-glyph OOB degrade
ohah/maru#176생성 · 병합mergedmaintest(terminal): document and cover the 1-column wide-glyph OOB guard
ohah/maru#175생성 · 병합mergedmainfix(terminal): implement DECAWM autowrap (deferred/pending wrap)
ohah/maru#174생성 · 병합mergedmaindebug(platform): log TerminalCore cell grid under MARU_DEBUG
ohah/maru#173생성 · 병합mergedmainfix(platform): compute terminal grid in Zig from real cell metrics
ohah/maru#172생성 · 병합mergedmainfeat(platform): render SGR cell background color
ohah/maru#171생성 · 병합mergedmainperf(platform): skip CoreText shaping on idle dev-session ticks
ohah/maru#170생성 · 병합mergedmainrefactor(platform): move grid math and resize dedup from Swift to Zig
ohah/maru#169생성 · 병합mergedmainfix(terminal): handle SGR colon sub-parameter extended color correctly
ohah/maru#168생성 · 병합mergedmainfix: address /code-review max findings (#162–#167) with regression tests
ohah/maru#167생성 · 병합mergedmainfeat(platform): real font metrics, Retina HiDPI, and bundled font for the dev shell
ohah/maru#166생성 · 병합mergedmainfix(platform): anchor glyphs on a common baseline instead of centering
ohah/maru#165생성 · 병합mergedmainfeat(platform): tint terminal glyphs with the cell foreground color
ohah/suji#141생성 · 병합mergedmainfeat(ipc): 큰 IPC 페이로드 무제한화 (청크 분할 + emit 동적 버퍼)
ohah/suji#140생성 · 병합mergedmainfeat(plugin): upload — multipart 파일 업로드 / 다운로드→디스크
ohah/suji#139생성 · 병합mergedmainfeat(plugin): positioner — 창을 화면/트레이/커서 위치로 배치
ohah/suji#138생성 · 병합mergedmainfeat(plugin): window-state — 창 bounds/maximized 저장·복원
ohah/suji#137생성 · 병합mergedmainchore(android): rust/go/multi 변형에 gradlew 래퍼 커밋 (6개 변형 통일)
ohah/suji#136생성 · 병합mergedmaintest(mobile): e2e 하니스 변형 견고화 (xcodegen-before-ls + bash 호출 + 루프 가드)