Files
2026-09-16 17:22:14 +09:00

4.0 KiB

완료 보고: 화면 캡쳐 → 챗 첨부 (002-capture-to-chat)

브랜치: feat/capture-to-chat · 작성: 2026-08-06 · 상태: 최종 승인 대기

전역 핫키 Ctrl+Shift+9 → 전체화면 오버레이 드래그 → 그 영역 캡쳐 → 챗 입력창에 이미지 첨부(썸네일+X). v1 = 캡쳐 파이프라인만, 멀티모달 분석·웹서치·이미지 백엔드 전송은 다음 phase.

계획 vs 결과

항목 계획 결과
Setup (T001-T002) System.Drawing.Common, PerMonitorV2 manifest
C# 캡쳐 (T004-T008) 좌표변환 순수함수+CopyFromScreen, 오버레이 창, 3번째 핫키, App 코디, SendCaptureImage 좌표변환 xUnit 5개(경계 포함), dotnet test 22/22
프론트 (T003,T009,T010) capture.image 수신(consume), Composer 이미지 첨부 bridgeNavigate/Composer 테스트, 프론트 237/237
Polish 검증·quickstart·report 검증 / quickstart 수동(사용자) / 이 문서

신규 vs 재사용

신규(실질): C# CaptureOverlayWindow(전체화면 투명·드래그선택·Esc/무효 취소) + ScreenCapture(좌표변환 순수부 + CopyFromScreen→PNG) + Composer 이미지 첨부 UI. 재사용: 멀티핫키(3번째 등록만), SendToWeb 브릿지(capture.image + 콜드스타트 버퍼 패턴), 팔레트 소환·/snap/new navigate, bridgeNavigate 이벤트 허브, Composer 첨부칩 패턴.

리뷰에서 잡아 고친 것

  • [C# Imp1] 캡쳐 실패 예외 미처리 → 앱 크래시 가능. → pw<=0||ph<=0 가드 + try/catch로 취소 흡수.
  • [C# Imp2] 콜드스타트 시 capture.image 유실(SendToWeb가 navigate만 버퍼). → capture.image도 버퍼링+NavigationCompleted flush.
  • [C# Min1] Esc/포커스아웃 경로 마우스캡처 미해제. → Finish()로 이동.
  • [프론트 Critical] read-once consume 구멍 — 이벤트 경로가 pending 안 비워 리마운트 시 stale 재첨부. → onCaptureconsumePendingCaptureImage() 호출로 양쪽 경로 비움 + 회귀 테스트.

검증

  • 프론트 237/237, C# 22/22, 빌드 클린(앱 실행 중이면 App exe copy-lock은 컴파일 이슈 아님).
  • 런타임 E2E(오버레이·CopyFromScreen·멀티모니터·DPI)는 헤드리스 불가 → 사용자 수동(quickstart 1~8).

남은 것 / 천장(추후)

  • [수동확인] quickstart — 실제 데스크톱에서 캡쳐·첨부·취소·멀티모니터.
  • [다음 phase] 이미지를 실은 메시지를 멀티모달 백엔드로 전송·비전 분석·응답, 웹서치. 전송 payload 배선도 그때.
  • [천장] mixed-DPI 좌표 보정, 대용량 base64 임시파일/blob 최적화.

최종 리뷰 (whole-branch, opus)

리소스(Bitmap/Graphics using·오버레이 누수 없음·예외 흡수·마우스캡처)·보안(로컬 캡쳐→자기앱, data:URI 스크립트 경로 없음)·회귀(3번째 핫키 독립·버퍼 2개 무간섭·텍스트첨부/전송 무손상) 다 클린.

신규 Important 1건 잡아 fix wave로 처리 완료(재리뷰 통과):

  • 기존 대화방에서 캡쳐 시 이미지 유실(내 read-once fix가 연 반대 구멍 — 출발지 Composer가 pending 훔침). → acceptCapture prop 게이팅(NewChatPage만 캡쳐 수신) + 회귀 테스트.

parked (cosmetic, merge 무관): 캡쳐 직후 붙여넣기-대상 배지가 잠깐 오버레이 자기 창으로 표기됨. 기능 무해(캡쳐는 새 대화行이라 paste-target 안 씀, 다음 소환 때 정상 갱신). 거슬리면 ForegroundWindow.Capture에 자기프로세스 HWND 무시 한 줄로 후속 가능.

최종 검증: 프론트 238/238, C# 22/22, 빌드 클린.

결론: 문서화된 천장(멀티모달 미전송·mixed-DPI·대용량 base64) + parked cosmetic 1건 제외하고 merge 준비 완료. 단 오버레이·캡쳐·멀티모니터 런타임은 헤드리스 미검 → 사용자 수동 확인 권장.