2026-09-20
요약 (AI 작성)
@ohah/pdf v0.1.0 이 npm 에 첫 출시된 날입니다 — Zig → wasm(321KB) PDF 엔진, 읽기·그리기·글자층·검색·양식 채우기·주석·서명 확인·암호·병합·XFA, 바닐라·React·Vue·Svelte. 이 판에는 라디오 묶음 배타와 겉모습 없는 주석 렌더가 들어갔습니다.
maru 편집기는 자동완성 ①-d 로 옆 문서 패널(목록이 열려 있으면 ⌃Space 로 토글, 강조 항목의 detail+documentation 을 목록 상자 옆에)을 붙이고, LSP 2단 ⑧ 로 semantic tokens 를 보이는 범위만 우리 11색으로 매핑해 tree-sitter 위에 겹쳤으며, property 는 ANSI 7(white)·attribute 는 ANSI 5(magenta) 로 enumMember·member 를 가릅니다. 에이전트 훅은 PostToolUse(Bash) 의 bashEditDiff.changedFiles 로 셸 편집을 귀속합니다(AT3b-2). session-host 는 client_slot 레지스트리 스캔이 tick 마다 192KiB 를 memcpy 해 세션 수에 비례하던 앱 CPU 를 잡고, 같은 UI 프레임 안 host 소켓 «비었나» 질문을 한 번만 해 poll 시스템콜을 15배 줄였으며(CPU 이득은 ≈0.25%p), resize 발행이 화면 청크에 배치 끝 표식을 달아 PartialFrame 의 생산자를 없앴습니다. E3c 의 「4,096 registry scan 가설 기각」은 계수기 사각이 만든 오판이라 정정했습니다. 마커 프리뷰는 그 pane 에 뜨고 리페인트에 죽지 않고 그림 뒤가 비치지 않습니다.
zntc 는 dev 서버 CSS 결함을 몰아서 고쳤습니다 — watch 이벤트가 CSS 등 asset 산출물을 보고하고(#4660), css-update href 를 주입된 <link> 와 맞춰 전체 리로드를 없애고(#4672), dev 산출 디렉토리를 CSS 탐색에서 제외해 dev 후 build 실패를 고치고(#4674), dev 의 PostCSS 변환 유실과 macOS 원자적 저장 후 watch 정지(#4679·#4682), dev 가 import 한 plain CSS 를 페이지에 연결하는 것(#4675). hwpjs 는 EMF 의 world transform·clip·fill·rendering origin·interpolation·compositing 과 EMF+ rectangle·lines·draw string·images·driver strings·container 를 파싱합니다(39커밋).
커밋
ohah/hwpjs
- feat(emf): parse rendering origin records
- feat(emf): parse text contrast records
- feat(emf): parse interpolation mode records
- feat(emf): parse emf plus pie records
- feat(emf): parse emf plus rectangle records
- feat(emf): parse emf plus paths
- feat(emf): parse compositing mode records
- feat(emf): parse set clip path
- feat(emf): parse set clip rect
- feat(emf): parse set page transform
- feat(emf): parse set world transform
- feat(emf): parse set clip region
- feat(emf): parse offset clip
- feat(emf): parse reset clip
- feat(emf): parse fill polygon
- feat(emf): parse terminal server graphics state
- feat(emf): parse terminal server clip records
- feat(emf): close graphics containers
- feat(emf): parse emf plus lines
- feat(emf): parse emf plus image points
- feat(emf): parse emf plus draw string records
- feat(emf): parse text rendering hint records
- feat(emf): parse compositing quality records
- feat(emf): parse save records
- feat(emf): parse emf plus images
- feat(emf): parse emf plus ellipses
- feat(emf): parse emf plus driver strings
- feat(emf): parse translate world transform
- feat(emf): parse multiply world transform
- feat(emf): parse reset world transform
- feat(emf): parse rotate world transform
- feat(emf): parse anti alias mode records
- feat(emf): parse scale world transform
- feat(emf): parse pixel offset mode records
- feat(emf): parse begin container records
- feat(emf): track save and restore state
- feat(emf): parse parameterless containers
- feat(emf): observe stroke fill path
- feat(emf): parse fill rects
ohah/maru
- test(boundary): registered_node_operations 접근 인벤토리를 포인터 순회로
- perf(session-host): client_slot 레지스트리 스캔이 tick 마다 192 KiB 를 memcpy 하던 것 — 포인터 순회로
- test(editor): 자동완성 ①-d 적대적 반복 5~8회차 — 새 변이 30 전부 사살; placeBeside 네 경계(PBX1)·스크롤 넘침/음수·폭 80·오른쪽 경계(SGD1)·로딩 줄 하나·상자 없는 ⌃Space·휠 0·줄 색·detail 없는 문서(CMP6)·host 그리기 순서·위 맞춤(host 판정자)·value 없는 MarkupContent(CPL9); D7·docs_loading 죽은 것 제거 (§8.2g-d)
- test(editor): 자동완성 ①-d 적대적 1~4회차 — 변이 38; B3 접힘+풀린 항목, B7 한 번만 세움, B18·B19·B20 제품 진입점(scrollWheel·mouse) 판정자, B11 등가 제거 (§8.2g-d)
- feat(editor): 자동완성 ①-d — 옆 문서 패널: 목록이 열려 있으면 ⌃Space 가 패널을 토글하고, 강조 항목의 detail + documentation(마크다운 축소)을 목록 상자 오른쪽(→왼쪽→아래→위)에 세운다; 미해결은 250 ms 뒤
…, 펼침은 세션 동안 기억, 패널 안 휠 (§8.2g-d) - test(boundary): poll 프레임 캐시의 선언 다섯을 client.zig reviewed delta 에 올린다
- perf(session-host): 같은 UI 프레임 안 host 소켓 «비었나» 질문을 한 번만 — poll 시스템콜 15× 감소
- test(terminal): 새 계약에 판정자를 붙이고, 찾는 일을 한 번만 한다 — 적대적 검증 3회
- fix(terminal): 프리뷰를 «그 pane» 에 그린다 — 비활성 pane 에서는 열리기만 하고 아무도 안 그렸다
- fix(terminal): 뒤판을 프레임마다 비운다 — 열어 두면 끝없이 쌓이고 있었다
- fix(terminal): 마커 프리뷰가 «그 pane» 에 뜨고, 리페인트에 죽지 않는다
- test(i18n): scm-turn-badges Lab 픽스처의 한국어 8줄을 원장에 올린다 — 제품 문구를 그대로 적어야 캡처가 제품을 예고한다 (CI check-boundaries 1/4)
- feat(agent-hooks): AT3b-2 —
PostToolUse(Bash)의bashEditDiff.changedFiles로 셸 편집을 귀속한다, 훅은 hunks 만 잘라내고 길이를 바이트로 센다, Codex 세트에PostToolUse(§4.2·§4.4, 계획 AT3b-2) - refactor(session-host): 호출자를 잃은 adoptSubscriptionTurn 을 지운다 — 판정자 넷이 제품에 없는 길을 재고 있었다
- fix(session-host): poll 프레임 캐시 도장이 판정자 사이에 샌다 — 집계 실행 1550/2662 «screen assembler yields …» 가 main 에서 죽는다
- fix(session-host): 화면 청크의 배치 끝 표식을 «인자로» 요구한다 — 잊을 수 있는 자리를 없앤다
- fix(session-host): resize 발행이 화면 청크에 배치 끝 표식을 단다 — PartialFrame 의 생산자였다
- docs(perf): E3c 의 「4,096 registry scan 가설 기각」을 정정한다 — 계수기 사각이 만든 오판
- feat(lsp): TS 계열 서버 후보 셋 — tsgo --lsp --stdio(native-preview) → typescript-language-server --stdio → tsc --lsp --stdio(typescript@7); PATH 에 있는 첫 후보를 세션 동안 기억하고 「없음」이면 다음 gate 가 다시 고른다; 설치 명령은 @typescript/native-preview (§8.2a 서버 찾기 — 사용자 결정 「tsgo 도 되어야」)
- fix(lsp): semantic tokens — TS 실측: legend
member를 function 으로, 설치 명령을typescript@5로 고정(typescript@7 은 tsserver.js 가 없어 서버가 initialize 에서 죽는다); range/full 은 폴백이 아니라 capability 분기라는 표현 정정 (§8.2i 되먹임 ④⑤ · §8.1a) - test(editor): semantic tokens 적대적 1~5회차 — 변이 50; A3 legend 없는 provider·A8 모르는 첨자·B19 1층 꼬리·C6 반열림 끝(스팬 목록) 판정자, A9·A10·B2·B15 죽은 가드 제거, B20·C2·C5·C8 등가 기록 (§8.2i)
- feat(editor): LSP 2단 ⑧ — semantic tokens 2층: 보이는 범위(±20줄)를 semanticTokens/range 로(범위 없는 서버는 full), legend 를 우리 11색으로 매핑해 1층 tree-sitter 스팬 위에 겹친 자리만 덮는다; 편집은 스팬을 밀고 120 ms 조용한 뒤 다시 묻고 낡은 version·오류 응답은 버린다 (§8.2i)
ohah/pdf
ohah/zntc
- fix(napi): rebuild 도 asset 산출물을 쓰고 목록을 이벤트로 노출 (#4660)
- fix(napi): watch 이벤트가 CSS 등 asset 산출물을 보고하도록 (#4660)
- fix(web): 파이프라인이 주입한 링크도 기억한다 — 혼합 위상 전체 리로드 제거 (#4672)
- fix(web): css-update href 를 주입된 <link> 와 맞춰 전체 리로드를 없앰 (#4672)
- test(server): #4682 watch 테스트를 플랫폼 공통 계약으로 — 폴 루프로 교체
- fix(web): dev 의 PostCSS 변환 유실 + macOS 원자적 저장 후 watch 정지 (#4679, #4682)
- fix(web): dev 산출 디렉토리를 CSS 탐색에서도 제외 — dev 후 build 실패 수정 (#4674)
- fix(web): dev 가 import 한 plain CSS 를 페이지에 연결한다 (#4675)