2026-09-19
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
zntc v0.1.9와 maru 편집기 자동완성이 들어온 날입니다. zntc는 전날 열린 #4664로 CJS default import 직접 축약을 ESM importer에도 적용하고, package.json "type":"module"을 사용자 프로젝트 코드에도 적용한 뒤(#4666, 앞선 시도 #4665는 닫힘) v0.1.9 릴리스 커밋을 냈습니다(#4667). 릴리스 뒤에는 bun.lock 동기화 PR 생성 실패를 조용히 넘기지 않도록 CI를 고쳤습니다(#4668). maru 편집기는 F2로 심볼 이름을 바꾸고 WorkspaceEdit 전부를 검증한 뒤 적용·저장하며 Undo Last Rename을 두었고(#3795), ⌘.로 진단 문맥의 code action을 컨텍스트 메뉴에 띄웠습니다(#3798).
자동완성은 세 조각이 들어왔습니다. 식별자·트리거 글자·⌃Space로 completion을 묻고 로컬 필터로 좁혀 고르면 textEdit과 additionalTextEdits가 undo 하나로 적용되는 ①-a(#3797), 서버 없는 파일에도 버퍼 단어를 띄우고 LSP 항목과 병합해 fuzzy로 정렬하며 강조 항목을 미리 resolve하는 ①-b(#3804), labelDetails 꼬리와 description을 보이고 넘치면 순서대로 접는 ①-c(#3807)입니다. ①-b와 함께 rust-analyzer가 i32를 넘는 요청 id를 알림으로 오인해 시그니처·포맷·rename·completion·code action 응답이 없던 것을 실측으로 찾아 id를 i32 안으로 넣었습니다.
terminal-core는 kitty 전송 매체 t=f/t=t/t=s와 S/O를 받아 kitten icat이 maru에서 memory를 고르게 했고(#3805), 원격 애니메이션은 「로컬 전용」이 아니라 「돌되 프레임마다 blob 전체를 싣는다」로 문서를 고쳤습니다(#3800). 에이전트 훅은 PostToolUse·PostToolUseFailure(Bash)로 셸 구간을 닫습니다(AT3b-1, #3806). 합자 왼쪽 오버항을 반올림에서 문턱 뺀 올림으로 바꿔 ...가 ..로 잘리던 결함을 고쳤고(#3802), 복구 세션의 한글 preedit를 PTY echo 전에도 제자리에 표시합니다(#3796). 「세션 정보를 동기화하지 못했습니다」가 어느 런타임에서 얼마나 기다려 났는지와 구독 무효화의 호출자를 로그에 남기게 했고, §10.9 폭포 검산은 기대 CTLine 4.2ms가 실측 4.19ms와 맞았습니다. hwpjs는 EMF+의 custom line cap·pen·region·string format·font·image attributes·clear 레코드와 arc·bezier·closed curve·curve 그리기 레코드를 파싱합니다.
공개 커밋 38개, 해당일 생성 또는 병합된 PR 18개를 정리했습니다. PR 생성 17개·병합 17개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/hwpjs
- feat(emf): parse emf plus draw curve records
- feat(emf): parse emf plus closed curves
- feat(emf): parse emf plus draw beziers records
- feat(emf): parse emf plus draw arc records
- feat(emf): parse emf plus clear records
- feat(emf): parse emf plus image attributes
- feat(emf): parse emf plus font objects
- feat(emf): parse emf plus string formats
- feat(emf): parse emf plus region objects
- feat(emf): parse emf plus pen objects
- feat(emf): parse emf plus custom line caps
ohah/maru
- 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)
- 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) - fix(session-host): 구독 무효화의 호출자마다 이름을 준다 — 이름이 있어도 못 갈랐다
- 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(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(font): 합자 왼쪽 오버항 칸 수를 반올림에서 문턱 뺀 올림으로 — JetBrains Mono
...(1.46칸)가..로 잘렸다 - docs(present): §10.9 에 폭포 검산을 보탠다 — 기대 CTLine 4.2ms = 실측 4.19ms, 남은 폭포 shaping 은 합자·폴백 그대로
- diag(app): 「세션 정보를 동기화하지 못했습니다」가 어느 런타임에서·얼마나 기다려 났는지 안 남겼다
- 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 가 빨갰다)
- docs(kitty): 원격 애니메이션은 «로컬 전용»이 아니라 «돌되 프레임마다 blob 전체를 싣는다»
- 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)
- fix(session-host): keep incremental Korean preedit anchored
- test(editor): 심볼 이름 바꾸기 적대적 1~4회차 — 변이 44; B17 은 메뉴바 ⌘Z 로 닿아 판정자 보강, C4 등가 선언 (§8.2f)
- feat(editor): 심볼 이름 바꾸기 — F2 → 인라인 상자 → textDocument/rename, WorkspaceEdit 를 전부 검증 뒤 적용(열려 있지 않은 파일은 디스크에, 두 파일 이상이면 저장), 기록 위의 Undo Last Rename (LSP 2단 ⑤, §8.2f)
ohah/zntc
- ci(release): bun.lock 동기화 PR 생성 실패를 조용히 넘기지 않는다
- chore: release v0.1.9
- fix(bundler): package.json "type":"module" 을 사용자 프로젝트 코드에도 적용
- perf(bundler): CJS default import 직접 축약을 ESM importer 에도 적용
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.