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

5.2 KiB

Implementation Plan: 화면 캡쳐 → 챗 첨부 (Screen Capture to Chat)

Branch: 002-capture-to-chat | Date: 2026-08-06 | Spec: spec.md

Input: Feature specification from specs/002-capture-to-chat/spec.md

Summary

전역 핫키 Ctrl+Shift+9 → 전체화면 투명 오버레이에서 사각형을 드래그해 그 영역을 캡쳐 → 이미지를 챗(snap) 입력창에 썸네일 첨부로 붙인다. v1은 캡쳐 파이프라인만 — 비전 분석·웹서치·이미지 백엔드 전송은 다음 phase.

기술 접근(재사용 우선): 실질 신규는 C# 캡쳐 오버레이 창 + 화면 픽셀 캡쳐Composer 이미지 첨부 UI 둘뿐. 핫키는 이미 멀티핫키(HotKeyService)라 등록만 추가(id 0x1002). 이미지 전달은 기존 C#→JS SendToWeb(PostWebMessageAsJson) 채널에 capture.image 메시지 한 줄. 프론트 수신은 bridgeNavigate 허브 + 마운트 레이스 대비 모듈 보관+이벤트(pasteTarget 패턴 그대로). 팔레트 소환·/snap/new navigate도 기존 배선.

Technical Context

Language/Version: TypeScript 5 / React 18 (Vite) · C# / .NET 8 (WPF, WebView2)

Primary Dependencies: (프론트) 기존 — 신규 없음. (C#) System.Drawing.Common(신규)Graphics.CopyFromScreen으로 화면 캡쳐. Microsoft.Web.WebView2(기존).

Storage: 없음(캡쳐 이미지는 메모리 → data URL, 챗 첨부 상태로만 존재. v1 영속 없음).

Testing: vitest(프론트: Composer 이미지 첨부 상태·capture.image 수신 로직) · xUnit(C#: 화면 캡쳐 좌표/DPI 변환 순수부분). 오버레이·CopyFromScreen 실물은 헤드리스 검증 불가 → 수동.

Target Platform: Windows 데스크톱(WebView2 런처). 순수 브라우저(dev)엔 캡쳐 없음(데스크톱 전용).

Project Type: 기존 웹앱(2_frontend) + 데스크톱 호스트(3_windowsApp)에 기능 추가.

Performance Goals: 핫키→오버레이 즉시. 드래그 종료→챗 첨부까지 체감 몇 초 내.

Constraints: 멀티모니터 커버(가상화면 전체). 캡쳐 좌표는 물리 픽셀(오버레이 DIP↔픽셀 배율 변환 필요).

Scale/Scope: 개인 단일 PC. 화면 캡쳐 1장/회, 첨부 누적 소수.

Constitution Check

GATE: Phase 0 전 통과, Phase 1 후 재확인.

.specify/memory/constitution.md는 빈 템플릿 → 형식 게이트 없음. 실질 캐논 = CLAUDE.md(재사용 우선·feature 컨벤션·docs-lib 선참조·TDD).

  • 재사용 우선: 멀티핫키·SendToWeb 브릿지·팔레트 소환·navigate·bridge 이벤트 패턴·Composer 첨부 UI 재사용. 실질 신규는 캡쳐 오버레이+화면캡쳐, Composer 이미지 첨부.
  • feature 위치: 캡쳐는 챗(snap) 입력 경로라 프론트 신규는 features/snap(Composer) + lib/bridge. C#는 CodeAssist.App/Views(오버레이) + CodeAssist.Shell/Platform(캡쳐 헬퍼).
  • ⚠️ 의도된 편차 — 이미지가 챗 메시지로 전송되지 않음(v1): 첨부는 표시·제거만, 전송은 기존 텍스트 그대로. 백엔드 멀티모달 계약 나올 때 전송 payload와 함께 배선. spec Out of Scope에 명시.

Gate: PASS.

Project Structure

Documentation (this feature)

specs/002-capture-to-chat/
├── plan.md              # 이 파일
├── research.md          # Phase 0 — 캡쳐 API·DPI·전달·수신·오버레이 결정
├── data-model.md        # Phase 1 — 캡쳐 이미지·첨부 상태 + 메시지 shape
├── contracts/
│   └── bridge-capture.md # capture.image 메시지 + 프론트 첨부 계약
├── quickstart.md        # Phase 1 — 수동 검증 시나리오
└── checklists/requirements.md

Source Code (repository root)

3_windowsApp/
├── CodeAssist.Shell/
│   ├── Platform/ScreenCapture.cs             # ★ 신규: 물리좌표 영역 → PNG 바이트(CopyFromScreen)
│   └── CodeAssist.Shell.csproj                # + System.Drawing.Common
├── CodeAssist.App/
│   ├── Views/CaptureOverlayWindow.xaml(.cs)   # ★ 신규: 전체화면 투명 오버레이·드래그 선택·Esc 취소
│   ├── App.xaml.cs                            # 확장: 3번째 핫키(Ctrl+Shift+9) + 캡쳐 코디네이션
│   └── Views/PaletteWindow.xaml.cs            # 확장: SendCaptureImage(dataUrl) 패스스루

2_frontend/src/
├── lib/bridge/
│   └── bridgeNavigate.ts                      # 확장: capture.image 수신 → 보관+이벤트(consume 세만틱)
└── features/snap/components/
    └── Composer.tsx                           # 확장: 이미지 첨부(썸네일+X) + 마운트 시 캡쳐 이미지 수령

Structure Decision: 기존 2폴더 구조 유지. C# 신규 2(오버레이·캡쳐헬퍼) + 확장 2(App·PaletteWindow). 프론트 확장 2(브릿지·Composer). 새 라우트/화면 없음(기존 /snap/new 재사용).

Complexity Tracking

Constitution 위반 없음. 편차 1건(v1 이미지 미전송)은 spec Out of Scope에 정당화됨. 별도 표 불필요.