2026-02-21
날짜는 UTC 기준으로 나눴습니다(9월 22일부터는 한국 시간 기준). 커밋은 커미터 시각(committer date), PR은 생성·병합 시각으로 분류했습니다. 목록은 2026-10-06 KST에 GitHub에서 다시 조회해 보강했습니다. 공개 저장소의 기본 브랜치 활동만 포함합니다.
요약 (AI 작성)
hwpjs는 머리말·꼬리말·각주·미주에서 중복되던 LIST_HEADER 처리를 공통 함수로 묶은 #6을 병합하고, 각주·미주마다 올바른 역참조 번호가 붙도록 고쳤습니다. HTML 표 출력은 캡션이 있을 때만 htG 래퍼를 쓰도록 fixture에 맞췄고(#9), 같은 문단의 절대 위치 표 순서와 htb 스타일, htG 높이까지 맞춘 #12도 병합했습니다. 이 과정에서 표 위치·크기·테두리와 줄 높이를 임의의 기본값이 아니라 파싱한 값이나 스펙에서만 가져오도록 정리하고 스냅샷을 갱신했습니다.
같은 날 genpdf로 PDF 내보내기를 시작해 본문 문단, 표와 이미지를 PDF로 그리고 toPdf NAPI와 to-pdf CLI를 붙였습니다. Base64와 디코딩된 이미지 크기에 상한을 두는 DoS 방어, 테스트용 Liberation Sans 폰트 번들이 #10으로 병합됐지만, to-pdf CLI와 일괄 PDF 옵션은 #11에서 주석 처리해 나중으로 미뤘습니다. 문서 디렉터리 이름을 docs에서 documents로 바꾸고, macOS에서 Linux x64·Windows용 네이티브 바이너리를 교차 빌드하는 설정과 안내를 추가했습니다. 각주·미주 공통 처리를 뽑아내는 #13은 이날 열렸습니다.
react-native-mcp는 CI E2E 기기를 지정하고 Android 에뮬레이터 해상도와 세로 방향을 고정한 #73을 병합했고, Android measureInWindow 좌표를 dp로 바꾸는 보정을 넣었다가 렌더 오버레이 위치가 어긋나 되돌리고 상단 inset으로 오버레이를 보정했습니다. 단계별 대기 시간과 작업 타임아웃을 늘려 E2E 35단계를 안정화했고(#74, #75), 채택 환경을 검사하는 doctor 명령과 Health HTTP 서버, 호환성·제한·리스크 문서를 추가했습니다(#76, #77). assertHasText 스텝은 assertText로 합치고 React state Hook 값을 검증하는 assert_state 도구를 추가했습니다(#78). E2E 화면 녹화 도구와 YAML 스텝을 넣는 #79는 이날 열렸습니다.
ohah.github.io에는 2월 21일 요약이 올라갔습니다.
공개 커밋 69개, 해당일 생성 또는 병합된 PR 13개를 정리했습니다. PR 생성 11개·병합 11개는 같은 PR이 양쪽에 포함될 수 있습니다.
커밋
ohah/hwpjs
- fix(core): table position and caption layout to match fixtures
- refactor(core): accept updated snapshots from table layout refinement
- chore(core): update snapshot test results from fixture alignment work
- refactor(core): remove redundant if/else blocks in table render
- test(core): add table comparison screenshots and borderfill/multicolumns layout snapshots
- test(core): add size.rs format and table/table_position HTML snapshots
- feat(core): match table layout to fixture (table2 DOM order, htb style, htG height)
- test(core): update HTML snapshots for parsed-values-only table/hls
- fix(core): ensure table position from hcd_position/page_def/offset only
- refactor(core): table border values from spec or parsed data
- fix(core): hls line-height and top from LineSegment/ParaShape only
- fix(core): SVG viewBox dimensions from content_size only
- fix(core): table content height from row_sizes/cell height only
- refactor(core): table position and caption width from parsed data only
- chore(node): disable to-pdf CLI and batch pdf options, document for later
- docs(documents): add Linux x64 cross-build installation guide
- chore(config): add Cross.toml and Ubuntu 24 Dockerfile for linux-x64 cross-build
- chore(node): add win32-x64-msvc native binary from cross-build
- chore(node): add darwin-arm64 native binary and cross-build usage in CONTRIBUTING
- feat(node): to-pdf CLI, batch pdf, default font dir, fonts bundle and clippy fixes
- fix(core): PDF viewer and test snapshot updates
- refactor(documents): rename docs to documents and update all references
- security(core): add DoS protection and cleanup pdf viewer
- docs(todos): mark PR#10 review items 001-010 resolved
- feat(core): bundle Liberation Sans for PDF tests and improve image handling
- test(core): add PDF export tests and content summary snapshots
- feat(node): add toPdf NAPI and to-pdf CLI command
- feat(core): PDF table and image support with genpdf images feature
- feat(core): iterate all body paragraphs in PDF export
- feat(core): expose HwpDocument::to_pdf
- feat(core): render first paragraph text into PDF
- feat(core): add PdfOptions and to_pdf stub returning minimal PDF
- chore(core): add genpdf dependency for PDF viewer
- feat(core): align HTML table output with fixtures (htG only when caption)
- fix(core): each footnote/endnote uses correct backlink number [^1], [^2], ...
- refactor(core): replace unwrap with expect in FileTime implementation
- docs(core): add comprehensive docstring for parse_record_from_tree
- refactor(core): reduce duplicate LIST_HEADER logic in header/footer/footnote/endnote processing
ohah/ohah.github.io
ohah/react-native-mcp
- feat(server): assert_state MCP 도구 추가
- refactor(server): E2E assertHasText 제거 및 assertText로 통일
- fix(e2e): Count 탭 직후 500ms 대기 추가로 waitForText 플레이크 완화
- chore(config): 린트·포맷·doctor 테스트 수정
- chore: Cursor 명령어 및 e2e 스텝 정리
- docs: 기존 문서에 상용 준비·E2E 링크 보강
- chore(ci): E2E 워크플로에 Doctor 스텝 추가
- docs: 상용 준비 문서 및 rspress 페이지 추가
- feat(server): Doctor 스크립트 및 Health HTTP 서버 추가
- test(server): adb-utils 모킹에 getAndroidTopInset 추가
- fix(server): runtime.js 에러 메시지 안전 출력
- fix(server): Android tap 전 topInset 보충 및 연결당 1회만 시도
- fix(test): Step 1 Count waitForText 타임아웃 3초 → 6초 (Android CI)
- fix(test): Step 14 postMessage 수 waitForText 타임아웃 5초 → 10초 (iOS CI)
- fix(config): CI E2E에서 all-steps.yaml만 실행하도록 변경
- fix(test): Step 8·9 버튼 20 (1) waitForText 타임아웃 3초 → 5초 (Android CI)
- fix(config): E2E iOS job 타임아웃 45분 → 60분
- chore(docs): e2e-landscape-tap-analysis.md 제거
- style(server): connection.ts console.warn 에러 메시지 타입 안전하게 처리
- fix(config): E2E Android job 타임아웃 30분 → 45분
- fix(test): E2E 전체 35 스텝 Step 10 scrollUntilVisible 완화
- fix(react-native): Android 리액트 스캔 오버레이 좌표 보정
- refactor(react-native): fiber 직렬화 시 measure uid를 path 기준으로 통일
- fix(react-native): Android measure 보정 제거로 컴포넌트 하이라이트 위치 복구
- test(e2e): Step 32 Bottom sheet 스와이프·대기 완화 (CI 안정화)
- chore(ci): Android E2E 에뮬레이터 세로 방향 고정
- fix(react-native): Android measure px→dp 변환 추가
- chore(config): CI E2E iOS·Android 워크플로 보완
- chore(config): CI E2E 시뮬레이터/에뮬레이터 기기 지정 및 Android 해상도 고정
PR (해당일 생성/머지)
상태는 조회 시점 기준입니다. merged는 아래 대상 브랜치에 병합됐다는 뜻이며, 기능 브랜치 병합과 main 반영을 구분합니다. 같은 PR이 생성일과 병합일 양쪽 기록에 나타날 수 있습니다.