84 lines
5.2 KiB
Markdown
84 lines
5.2 KiB
Markdown
# Implementation Plan: 화면 캡쳐 → 챗 첨부 (Screen Capture to Chat)
|
|
|
|
**Branch**: `002-capture-to-chat` | **Date**: 2026-08-06 | **Spec**: [spec.md](./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)
|
|
|
|
```text
|
|
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)
|
|
|
|
```text
|
|
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에 정당화됨. 별도 표 불필요.
|