2026-09-19
요약 (AI 작성)
zntc v0.1.9 와 편집기 자동완성이 들어온 날입니다. zntc 는 package.json "type":"module" 을 사용자 프로젝트 코드에도 적용하고(#4666), bun.lock 동기화 PR 생성 실패를 조용히 넘기지 않게 CI 를 고쳐 v0.1.9 를 냈습니다. 편집기는 심볼 이름 바꾸기 — F2 → textDocument/rename, WorkspaceEdit 전부를 검증한 뒤 적용·저장·Undo Last Rename — 과 code action(⌘. 로 진단 문맥의 codeAction 을 컨텍스트 메뉴로), 그리고 자동완성 세 조각을 얻었습니다: LSP 완성 팝업(①-a — 식별자·트리거 글자·⌃Space 로 묻고 로컬 필터로 좁혀 고르면 textEdit+additionalTextEdit), 버퍼 단어·LSP 병합·fuzzy·강조 항목 미리 resolve·kind 열(①-b, §8.2g-b), labelDetails 꼬리와 description(①-c).
terminal-core 는 kitty 전송 매체 t=f/t=t/t=s 와 S/O 를 받아 kitten icat 이 maru 에서 memory 를 고르게 했고, 원격 애니메이션은 «로컬 전용» 이 아니라 «돌되 프레임마다 blob 전체를 싣는다» 로 문서를 고쳤습니다. 에이전트 훅은 PostToolUse·PostToolUseFailure(Bash) 로 셸 구간을 닫습니다(AT3b-1). 합자 왼쪽 오버항을 반올림에서 문턱 뺀 올림으로 바꿔 ... 가 .. 로 잘리던 결함을 고쳤고, 복구 세션의 한글 preedit 를 PTY echo 전에도 제자리에 표시합니다. §10.9 폭포 검산은 기대 CTLine 4.2ms 가 실측 4.19ms 와 맞았습니다. hwpjs 는 EMF+ image attributes·clear·string format·region·draw curve·beziers 를 파싱합니다.
커밋
ohah/hwpjs
- feat(emf): parse emf plus image attributes
- feat(emf): parse emf plus font objects
- feat(emf): parse emf plus clear records
- feat(emf): parse emf plus custom line caps
- feat(emf): parse emf plus string formats
- feat(emf): parse emf plus pen objects
- feat(emf): parse emf plus region objects
- feat(emf): parse emf plus closed curves
- feat(emf): parse emf plus draw curve records
- feat(emf): parse emf plus draw arc records
- feat(emf): parse emf plus draw beziers records
ohah/maru
- test(editor): 심볼 이름 바꾸기 적대적 1~4회차 — 변이 44; B17 은 메뉴바 ⌘Z 로 닿아 판정자 보강, C4 등가 선언 (§8.2f)
- feat(editor): 심볼 이름 바꾸기 — F2 → 인라인 상자 → textDocument/rename, WorkspaceEdit 를 전부 검증 뒤 적용(열려 있지 않은 파일은 디스크에, 두 파일 이상이면 저장), 기록 위의 Undo Last Rename (LSP 2단 ⑤, §8.2f)
- test(editor): 자동완성 적대적 1~5회차 — 변이 46; B5·B9·B14·B16·B8v·B12v 판정자 보강, B17 등가, C10 호버 가드는 tick 하나로 (§8.2g)
- feat(editor): 자동완성 ①-a — 식별자 글자·트리거 글자·⌃Space 로 textDocument/completion, 낱말 아래 suggest_box 에 로컬 필터 목록, ↑↓/Enter/Tab/Esc, 고르면 textEdit+additionalTextEdits 가 undo 하나 (LSP 2단 ⑥, §8.2g)
- docs(kitty): 원격 애니메이션은 «로컬 전용»이 아니라 «돌되 프레임마다 blob 전체를 싣는다»
- test(editor): code action 적대적 1~4회차 — 변이 30; B5 상한(MANYACT)·B8 resolve 빈 응답(RESOLVEEMPTY)·C6 알림 글자 판정자, A6 죽은 가드 제거, B13 등가 (§8.2h)
- feat(editor): code action — ⌘. 로 caret/선택 자리의 진단을 문맥으로 textDocument/codeAction, edit 있는 항목(또는 resolve 되는 항목)만 컨텍스트 메뉴로, 고르면 WorkspaceEdit 를 §8.2f 로 적용 (LSP 2단 ⑦, §8.2h)
- test(session-host): RemoteRuntime 크기 pin 을 48f89bc10 뒤의 실측값으로 — Debug 11712 · ReleaseFast 11664 (main 의 check 가 빨갰다)
- fix(session-host): keep incremental Korean preedit anchored
- docs(present): §10.9 에 폭포 검산을 보탠다 — 기대 CTLine 4.2ms = 실측 4.19ms, 남은 폭포 shaping 은 합자·폴백 그대로
- fix(font): 합자 왼쪽 오버항 칸 수를 반올림에서 문턱 뺀 올림으로 — JetBrains Mono
...(1.46칸)가..로 잘렸다 - diag(app): 「세션 정보를 동기화하지 못했습니다」가 어느 런타임에서·얼마나 기다려 났는지 안 남겼다
- test(packages): @maru-term 판정자의 DA1 기대값을 ?62;22c 로
- fix(kitty-media): cross-target stat 과 RemoteRuntime 크기 pin, wasm 재빌드
- feat(terminal-core): kitty 전송 매체 t=f/t=t/t=s + S/O — 리더가 락 밖에서 읽고 파서는 그 뒤에서 멈춘다
- fix(lsp): 요청 id 를 i32 안으로 — 종류마다 1e8 칸(nextSeq 가 칸 안에서 돌린다); rust-analyzer(lsp-server)는 i32 를 넘는 정수 id 를 알림으로 오인해 시그니처·포맷·rename·completion·code action 응답이 없었다 (실측, §8.2a id 표) + 캡처 훅 MARU_FORCE_SUGGEST=accept
- test(editor): 자동완성 ①-b 적대적 1~5회차 — 변이 59; A5 1 MiB 상한·A13 짧은 filter·B6 열릴 때 resolve·B9 되묻지 않음·B17 300 ms 리터럴·B19 강조 이동 resolve·B23 words_only 판정자, B18·B25·B21 죽은 가드 제거, B10·B22·C2 등가 (§8.2g-b)
- feat(editor): 자동완성 ①-b — 서버 없는 파일도 버퍼 단어로 뜨고, LSP 항목과 병합(같은 label 은 LSP), fuzzy 정렬, 강조 항목 completionItem/resolve 로 미리 풀어 확정은 undo 하나(300 ms 지나면 additional 없이), kind 한 글자 열 (§8.2g-b)
- test(agent-hooks): statusline 제거 판정자의 settings.json 읽기 상한을 64 KiB 로 — 훅 세트 11개(AT3b-1)라 우리 항목만 ~27 KB, 16 KiB 가 StreamTooLong 으로 죽었다 (CI)
- feat(agent-hooks): AT3b-1 —
PostToolUse·PostToolUseFailure(Bash) 로 셸 구간을 닫는다, 순수 층shell_bracket+ 턴과 함께 봉인 (§4.4, 계획 AT3b) - test(editor): 자동완성 ①-c 적대적 1~3회차 — 변이 27; A18 그리기가 fold 의 label 값을 쓴다(SGB3 긴 label 행), A9 등가 제거, B8 등가 기록 (§8.2g-c)
- feat(editor): 자동완성 ①-c — labelDetails: initialize 에 labelDetailsSupport 를 내고, 행은 label 뒤에 꼬리(labelDetails.detail, 옅게)·오른쪽엔 description(없으면 detail, 옅게); 넘치면 오른쪽(16 문턱) → 꼬리 → label 순으로 접는다 (§8.2g-c)
- fix(session-host): 구독 무효화의 호출자마다 이름을 준다 — 이름이 있어도 못 갈랐다
ohah/zntc
- perf(bundler): CJS default import 직접 축약을 ESM importer 에도 적용
- fix(bundler): package.json "type":"module" 을 사용자 프로젝트 코드에도 적용
- chore: release v0.1.9
- ci(release): bun.lock 동기화 PR 생성 실패를 조용히 넘기지 않는다