2026-08-23
요약 (AI 작성)
@maru/* 를 쓸 만하게 만든 날입니다. 진짜 PTY 로 TUI 를 검증하며 IME 결함을 고치고, 화면·스크롤 제어와 상태 이벤트, 검색과 OSC 사건(정책은 소비자가 정한다), 직렬화·키 가로채기·선택 조회까지 API 표면을 마무리했습니다. 렌더 비용을 재 보니 WebGL 렌더러(F7.5)는 필요 없어 계획에서 지웠습니다.
Windows 는 드래그 선택과 caret(W8.3⒞3), 폰트 id 다리와 자유 위치 셀로 measured 텍스트, 소스 컨트롤이 눌리고(접기와 고르기) 스테이지·언스테이지가 진짜 git 을 움직이며, 창이 터미널과 도크로 갈렸습니다. 굵기 0 이 run 을 조용히 지우던 것은 이음매 굵기를 타입으로 막았습니다. 편집기는 ⌘F 가 문서를 검색하고(있던 기능이 아니라 조용히 틀린 것이었다, §5.1) 탭 폭을 설정에서 받습니다 — 완성된 세터에 호출자가 없었습니다.
에이전트 턴은 write-tree 를 재보고 턴 캡처를 git 에서 떼어냈으며, 링의 주인을 저장소에서 세션으로 옮겼습니다(AT0). 모바일은 친 글자가 두 번 나가고 소켓으로 나가려 최대 2초 기다리던 것, 엔터·탭이 원격에 안 가던 것, tmux prefix 다음 키·시스템 바 겹침을 고쳤습니다. session-host 는 raw TTY 진입 전 출력 프리미티브와 진입 장벽을 고정하고 hostile pump 증거를 닫았으며, 편집기 N2 버퍼 게이트를 걷고 "뒤집힐 조건" 으로 바꿨습니다.
커밋
ohah/maru
- docs(agent-turn): write-tree 를 재보고 턴 캡처를 git 에서 떼어낸다
- ci(packages): playwright 설치 명령과 아티팩트 실패 처리를 고친다
- ci(packages): 브라우저 검사에 필요한 playwright 바이너리를 받는다
- fix(packages): 리뷰 cap 밖 8건 + 워커에서 죽어 있던 onRender
- docs: 처리량·메모리 수치를 실측으로 바로잡는다
- fix(packages): 측정 한계와 팔레트 divergence
- fix(wasm): 스냅샷이 24,576셀에서 잘리던 것과 무시하던 반환값 둘
- fix(packages): 누수 셋 — dispose 중 open, autoFit 이중 옵저버, 무한 stamp 캐시
- fix(packages): 마우스·포커스 리포트를 DOM 에 배선한다
- fix(packages): 워커 검사의 타입 단언이 게이트를 깨뜨리던 것
- fix(packages): 워커 모드에서만 갈리던 결함 셋
- ci(packages): npm 패키지를 실제로 검사하는 워크플로를 추가한다
- fix(wasm): 붙여넣기가 입력 버퍼를 넘어 인접 정적 버퍼를 덮어쓰던 것
- fix(wasm): 드리프트 게이트가 구조적으로 통과만 하던 것 — 커밋본도 이미 어긋나 있었다
- docs: 계약 문서를 코드와 대조해 어긋난 곳을 고친다
- docs: 현재 범위와 후속 계획을 xterm.js 와 1:1 대조해 남긴다
- refactor(packages): 데모를 TypeScript 로 옮기고 검사 대상에 넣는다
- test(packages): 네 래퍼가 실제로 마운트되는지 브라우저에서 본다
- fix(packages): 브라우저 검사의 동적 import 가 타입 검사를 깨뜨리던 것
- test(packages): 커서 깜빡임과 줄 간격 여백을 회귀로 못 박는다
- build(packages): 개발 의존성을 최신으로 올린다
- docs: 이번 사이클의 실측과 판정을 문서에 반영한다
- fix(packages): 줄 간격으로 늘어난 여백을 위아래로 나눈다
- build(packages): 잠금 파일과 무시 목록을 커밋한다
- docs: maru-term 라이브러리 계약과 wasm 이식성을 문서로 둔다
- ci(packages): changed-areas 에 packages 축을 추가한다
- feat(packages): 번들 폰트(Jetendard)와 데모 페이지
- feat(packages): React·Vue·Svelte·Lit 래퍼
- feat(packages): @maru/core — 바닐라 TS 터미널과 Canvas 렌더러
- feat(wasm): 터미널 코어를 wasm32-freestanding 으로 낸다
- fix(mobile): 원격 명령이 그냥 끝난 것을 시한과 갈라 말한다
- fix(windows): 실제로 돌리니 글자가 안 나왔다 — 폰트 id 체계가 둘이었다
- feat(windows): measured 텍스트의 마지막 한 걸음 — 글리프별 크기와 자유 위치 셀
- refactor(scm): 행 모델 → 컴포넌트 항목 변환을 중립으로 뺀다
- fix(windows): 굵기 0 이 run 을 조용히 지웠다 — 이음매 굵기를 타입으로 막는다
- style(file-tree): zig fmt 를 맞추고 잘못 붙은 doc comment 를 옮긴다
- feat(file-tree): 히트테스트·호버를 발행된 tree 로 옮긴다 (FT2)
- test(packages): 휠 인코딩을 회귀로 못 박고 F1 탐색 결과를 기록한다
- fix(packages): IME 조합이 화면 버퍼를 건드려 앱과 어긋나던 것
- feat(packages): 진짜 PTY 를 붙이는 탐색 하네스와, 거기서 나온 회귀 테스트
- docs(plan): 모바일 계획 M/U 전수 점검 — 다섯 줄이 실제와 달랐다
- perf(packages): 렌더 비용을 재서 WebGL 렌더러(F7.5)를 계획에서 지운다
- fix(mobile): 컨트롤 축의 실패가 터미널 배너로 새던 것
- fix(mobile): 친 글자가 두 번 나가고, 조합이 격자에서 떠 있던 것
- fix(mobile): 친 글자가 소켓으로 나가려고 최대 2초 기다리던 것
- feat(packages): 상태 이벤트 — onCursorMove·onScroll·onSelectionChange
- docs(packages): 애드온으로 나누지 않는 이유를 판정으로 남긴다
- fix(packages): 폭을 줄이면 scrollToTop이 절반만 올라갔다
- feat(packages): 화면·스크롤 제어 API — reset·clear·scrollToTop/Line/Lines/Pages
- fix(packages): 스크롤 위치가 65535행에서 잘려 스크롤바가 어긋났다
- feat(windows): 드래그 선택과 caret (W8.3⒞3)
- docs(pr): 웹 배포판 라벨 terminal-web 을 라벨 표에 등록한다
- feat(packages): OSC 사건 — 클립보드·알림·셸 통합, 정책은 소비자가 정한다
- feat(packages): 검색 — findMatches·findNext·findPrevious
- fix(file-tree): 스크롤과 그리기 사이에 온 포인터가 다른 행을 열던 것
- fix(file-tree): view 예산이 실제로 내는 op·글자보다 작던 것
- fix(file-tree): 낡은 발행 인덱스가 배열 범위를 넘어 죽던 것 (FT2 후속)
- feat(editor): 탭 폭을 설정에서 받는다 — 완성된 세터에 호출자가 없었다 (§9)
- docs(editor): N2 버퍼 게이트를 걷고 "뒤집힐 조건"으로 바꾼다 (§3.0·§10)
- fix(windows): macOS CI 가 잡은 축 불일치 — 행→줄 표는 u32 다
- fix(windows): 적대적 검증 2 라운드 — 뮤턴트 넷, 그중 하나가 살아남았다
- feat(windows): 클릭이 문서를 짚는다 — 히트테스트를 중립으로 뺀다 (W8.3⒞2)
- feat(session-host): raw TTY 진입 장벽을 고정한다
- feat(session-host): close F3e hostile pump evidence
- fix(agent-hooks): 훅 모드에서 사라지던 대화 줄과 알림을 되살린다
- feat(session-host): bind stable external pump owner
- feat(mobile): 앱 바에 끊는 자리를 두고, 끊긴 것을 끊겼다고 말한다
- fix(mobile): 실기기에서 드러난 입력·경계 결함 셋
- fix(mobile): 마우스를 켠 TUI 에서 터치 스크롤이 아무것도 못 움직이던 것
- test(windows): 안 재고 있던 주장 둘 — 강조와 판정 불가
- test(windows): 초록인데 무엇을 재는지가 틀렸다 — 판정 셋을 고친다
- fix(windows): 마우스를 올려도 아무 표시가 안 났다 — dirty 를 봐야 한다
- chore(windows): 안 쓰는 error set 을 지운다
- feat(windows): 소스 컨트롤이 눌린다 — 접기와 고르기
- docs(agent-turn): 링의 주인을 저장소에서 세션으로 옮긴다
- test(mobile): i18n 원장을 44 로 올린다
- fix(ios): 세션이 살아 있을 때만 컨트롤 종료 코드를 명령 실패로 읽는다
- fix(mobile): 연결이 없으면 컨트롤 축의 잔해가 아니라 연결을 말한다
- fix(mobile): 끊으면 그 자리에 남지 않고 목록으로 나간다
- feat(windows): 스테이지·언스테이지가 진짜 git 을 움직인다
- test(file-tree): 이동한 파일이 다른 타깃에서 정말 컴파일되는지 프로브로 확인한다
- fix(file-tree): 파일을 옮기며 i18n 게이트 밖으로 나간 것 — 적대적 검증
- refactor(file-tree): 셀 투영을 platform 공유 모듈로 옮긴다 — "격리" 판단을 바로잡는다
- feat(file-tree): 셀 경로를 Windows 하나로 격리하고 게이트로 잠근다 (FT3)
- feat(session-host): add pre-raw TTY output primitives
- docs(plan): 모바일 진행 표기를 실제 상태에 맞춘다
- docs(packages): 3차 적대적 검증 — findNext 의 순회 한계를 못 박는다
- test(packages): 두 모드 API 동일성 대조 — 그리고 그 대조가 처음엔 아무것도 못 잡았다
- fix(packages): 적대적 검증에서 나온 결함 셋과 검증 공백 하나
- feat(packages): API 표면 마무리 — 직렬화·키 가로채기·선택 조회
- test(session-host): wait on observer readiness
- feat(session-host): add CR6f output wake
- feat(session-host): orchestrate control responses in turn
- fix(scm): 턴 목록이 시각과 세션을 말하게 한다
- docs: 공용 코드에 새 폴더를 만들지 않는다 — 자리는 이미 있다
- fix(android): 엔터·탭이 원격에 안 가던 것 — 막는 기준이 너무 넓었다
- test(scm): 캡처 하니스가 세션 둘을 심어 순번 화면을 찍게 한다
- feat(scm): 턴 줄이 «몇 개 파일을 고쳤나» 를 펼치지 않고 말한다
- fix(scm):
진행 중이 에이전트 상태가 아님을 이름으로 말한다