v0.2.0

WSPN Comm v2 — PRD

웹챗 기반 | React + Vite + CF Pages (PWA)
기반: v1.0.0 (282 커밋, 7,900 LOC)
📋 초안 — 성우님 리뷰 대기
🖼 와이어프레임 보기 →

📝 변경 이력

2026-03-01 — v0.3.0 컬러 테마 커스텀 프리셋 5종 추가 (슬랙 스타일). 와이어프레임 페이지 추가.
2026-03-01 — v0.2.1 탭뷰/섹션/필터 수치 스펙 추가. 납작한 탭뷰 문제 스크린샷 추가.
2026-03-01 — v0.2.0 디자인 레퍼런스 섹션 추가. 구조=WSPN Comm, 감각=wespichat. 컴포넌트 수치 스펙 정의.
2026-03-01 — v0.1.0 초안 작성. v1 최종 확정(v1.0.0 태그) 후 v2 시작.

1. 왜 만드는가

AI 에이전트 4명(독술/코낄/고릴/호랑)과 일하면서 겪는 문제:

  1. 세션 연속성 없음 — 컴팩션/핸드오프 시 대화가 끊김. 새 토픽을 매번 열어야 함.
  2. 아티팩트 접근 불편 — 에이전트가 만든 대시보드/차트를 채팅에서 바로 못 봄.
  3. 파일 교환 불가 — 이미지/파일 첨부 안 됨.
  4. 진행 상황 불투명 — 에이전트가 뭘 하고 있는지 실시간으로 안 보임.

슬랙/텔레그램으로는 1번(세션 연속성)2번(아티팩트 인라인)이 구조적으로 불가능.
→ 직접 만드는 이유.

2. v1에서 바뀌는 것

영역v1v2
세션 연속성없음/new 후 같은 채팅 이어가기 + 컴팩션 알림
아티팩트 연결UI만세션별 아티팩트 실제 매칭
파일 업로드스켈레톤R2 Worker 연동 완성
코드 구조chatStore 1,048줄 God Object관심사별 스토어 분리

안 바꾸는 것

🏗 UI 계층 구조

WSPN Comm의 모든 UI는 이 4계층으로 구성됩니다. 채팅이 주인공이고, 나머지는 채팅을 조직하고 보여주기 위한 구조입니다.

계층이름역할비유
채팅 (Chat) 주인공. 하나의 대화 흐름. OpenClaw 세션에 해당하며, 핸드오프/컴팩션을 거치는 일련의 세션들을 하나의 채팅으로 연결함. 문서 파일
카드 (Card) 채팅을 보여주는 UI 단위. 카드 내 멀티탭으로 하나의 카드 안에서 여러 채팅을 탭으로 전환 가능. 에디터 창
패널 (Panel) 여러 카드가 그리드 구조로 배치된 한 화면. 작업 맥락 단위. 사이드바에서 카드 리스트를 보여주는 이유는 패널 전환을 용이하게 하기 위함. 데스크탑 배치
패널 탭 (Panel Tab) 여러 패널을 탭으로 전환하면서 전체 화면을 활용. "재무 작업", "개발 작업" 등 맥락별 패널 세트. 가상 데스크탑
핵심 분리: 채팅 = 데이터 단위 (세션 체이닝) / 카드 = UI 단위 (표시 방법)
→ 같은 채팅을 다른 카드에서 열 수도 있고, 하나의 카드에 여러 채팅을 탭으로 넣을 수도 있음.
패널 탭: [🖥 개발작업] [📊 재무작업] [🎨 디자인]
└─ 패널: 카드들의 그리드 (가로/세로 분할)
├─ 카드 A: [🐘 API수정] [🐘 배포] ← 멀티탭
│ └─ 채팅: 세션1 → 세션2 → 세션3 (체이닝)
└─ 카드 B: [🦅 재무분석]
└─ 채팅: 세션1 → 세션2 (체이닝)

3. 기능 명세

3.1 세션 연속성 ⭐ 최우선

문제: 에이전트 세션이 컴팩션되거나 리셋되면 대화 맥락이 끊김. 사용자는 같은 채팅에서 이어가고 싶음.

3.1.1 같은 채팅에서 세션 이어가기

3.1.2 컴팩션 감지 + 알림

3.1.3 세션 히스토리 통합

3.2 아티팩트 연결 완성 P3

3.2.1 "이 채팅" 아티팩트 필터

3.2.2 아티팩트 인라인 카드 강화

3.3 파일 업로드 P4

3.3.1 업로드 플로우

3.3.2 R2 Worker

3.4 코드 리팩터링 P1

3.4.1 스토어 분리

3.4.2 컴포넌트 분리

4. 와이어프레임

4.1 세션 연속성 UI

┌─────────────────────────────────────┐ │ 🐘 코낄 — WSPN API 수정 │ │─────────────────────────────────────│ │ │ │ [에이전트] v0.8.0 배포 완료했어요 │ │ │ │ ── 세션 리프레시됨 (03-01 14:30) ── │ │ │ │ [에이전트] 안녕하세요, 이어서 │ │ 진행하겠습니다. │ │ │ │ ⚠️ 컨텍스트 압축됨 │ │ [핸드오프 파일 읽기] ← 클릭 버튼 │ │ │ │ [나] 핸드오프 읽고 이어가줘 │ │ │ │─────────────────────────────────────│ │ 토큰: ████████░░ 72% │ │ [📎] [메시지 입력...] [전송] │ └─────────────────────────────────────┘

4.2 파일 업로드 UI

┌─────────────────────────────────────┐ │ ...채팅 메시지들... │ │ │ │─────────────────────────────────────│ │ ┌──────┐ ┌──────┐ │ │ │ 📷 │ │ 📄 │ ✕ 제거 │ ← 프리뷰 바 │ │img.png│ │spec │ │ │ └──────┘ └──────┘ │ │─────────────────────────────────────│ │ [📎] [메시지 입력...] [전송] │ └─────────────────────────────────────┘

4.3 아티팩트 "이 채팅" 탭

┌─ ArtifactBrowser ───────────────────┐ │ [이 채팅] [전체] [즐겨찾기] │ │ 🔍 검색... │ │─────────────────────────────────────│ │ 📊 매출 분석 차트 03-01 10:00 │ │ 📋 API 스펙 테이블 02-28 15:30 │ │ 📈 트래픽 대시보드 02-28 09:00 │ │ │ │ (이 채팅의 세션에서 생성된 것만) │ └─────────────────────────────────────┘

5. 마일스톤

Phase내용예상상태
P0PRD 확정 + 와이어프레임 리뷰오늘⏳ 리뷰 중
P1코드 리팩터링 (스토어 + 컴포넌트 분리)1일
P2세션 연속성 (핵심)1일
P3아티팩트 "이 채팅" 연결반나절
P4파일 업로드 (R2 + UI)1일
P5통합 테스트 + 폴리싱반나절

총 예상: 4~5일

6. 기술 결정

항목결정사유
프레임워크React + Vite (유지)Tauri 불필요, PWA 충분
로컬 DBIndexedDB (유지)SQLite는 Tauri 전용이었음
배포CF Pages + PWA기존 인프라
파일 저장R2 Worker기존 Worker 재사용
상태 관리Zustand (분리)God Object 해소

7. v1 교훈 → v2 원칙

  1. God Object 금지 — 스토어/컴포넌트 500줄 넘으면 분리
  2. 기능 이전 시 구버전 즉시 제거 — 중복 코드 방치 금지
  3. 드롭다운 배경 불투명 — Glass UI여도 메뉴 가독성 우선
  4. 모바일 전용 컴포넌트isMobile 분기 대신 별도 설계
  5. 커밋 단위 작게 — 기능 단위 커밋, 리팩터와 기능 추가 분리
  6. 변경 전 git commit — 작업 전 안전망 확보

🎨 디자인 레퍼런스

원칙: 구조는 WSPN Comm, 감각은 wespichat

영역기준출처
레이아웃 구조탭뷰 → 패널 분할 → 채팅 탭, D&D, 캐스케이드WSPN Comm v1
사이드바 섹션즐겨찾기, 탭뷰, 전체 채팅, 상태 표시WSPN Comm v1
단축키 체계Ctrl+Shift 조합, Cmd+B 등WSPN Comm v1
공간 활용여유로운 여백, 요소를 우겨넣지 않음wespichat
밀도 조절사이드바 아이템 높이, 아바타 크기, 줄간격wespichat
폰트 사이즈충분히 크고, 계층이 명확wespichat
레이어드 depth배경 → 사이드바 → 채팅 → 카드 → 콘텐츠 단계적 밝기wespichat
아티팩트 카드인라인 프리뷰 + "패널에서 보기" + 버전 셀렉터(v1/v2/v3)wespichat

레퍼런스 스크린샷

❌ WSPN Comm v1 — 밀도 문제

Glass UI 비주얼은 좋지만 요소를 우겨넣어서 숨이 막힘. 좌상단 헤더 영역이 특히 심함.

WSPN Comm v1 — 밀도 문제

✅ wespichat — 디자인 목표

공간 배분, 여백, 폰트 사이즈가 자연스러움. 이 감각을 v2에 적용.

wespichat — 디자인 목표 1 wespichat — 디자인 목표 2

컴포넌트 수치 스펙 (v2 기준)

컴포넌트v1 (문제)v2 목표
사이드바 폭260-300px280px (최소), 자유 리사이즈
사이드바 아이템 높이36-40px56px
아바타 크기20-24px36px
사이드바 좌우 패딩px-4 (16px)16px (유지)
헤더 영역 높이우겨넣음56px (여유 있게)
메시지 간 간격가변24px
메시지 본문 폰트15px × scale15px (유지)
타임스탬프 폰트10px12px
에이전트명 폰트11px14px semi-bold
토픽명 폰트 (사이드바)13px14px
프리뷰 텍스트 (사이드바)11px13px
입력창 높이단일행44px 최소, 멀티라인 확장
패널 헤더 높이~30px48px
인라인 아티팩트 카드없음 (URL만)◆ 아이콘 + 제목 + 버전 + 프리뷰
탭뷰 탭 높이~28px, 패딩 4px40px, 패딩 10px
탭뷰 탭 폰트13px14px semi-bold
탭뷰 탭 바 배경없음 (콘텐츠와 구분 안 됨)별도 컨테이너, glass bg + border-bottom
섹션 헤더 (즐겨찾기/탭뷰)리스트와 구분 안 됨12px uppercase + 16px 상단 마진
섹션 간 간격4-6px16px
필터 버튼 (전체/진행/대기/완료)~20px 높이32px pill, 터치 타겟 44px

❌ 탭뷰 현재 — 납작하고 구분 안 됨

탭뷰 밀도 문제

컬러 테마 커스텀 (신규)

슬랙처럼 프리셋 기반 컬러 테마 선택. 2~3개 핵심 색상 조합으로 전체 분위기 변경.

테마사이드바PrimaryAccent느낌
🌙 Midnight (기본) #0f1019 #5252FA #BAFC27 현재 Glass UI
🍇 Aubergine #3F0E40 #E01E5A #ECB22E 슬랙 클래식
🌊 Ocean #0D1B2A #0EA5E9 #38BDF8 차분한 블루
🌿 Forest #1A1F16 #22C55E #A3E635 자연 그린
☀️ Light #F0F0F3 #5252FA #7C3AED 밝은 모드

구현: CSS 변수 --c-sidebar, --c-primary, --c-accent 3개만 바꾸면 전체 테마 전환. 배경 블롭 색상도 primary 기반으로 자동 파생.

Glass UI 유지 사항

8. 후순위 (v2 이후)

기능사유
에이전트별 알림음nice-to-have
인증 시스템현재 성우님 혼자 사용
브라우저 NotificationPWA permission 필요
Tauri 네이티브 앱웹챗이 충분하면 불필요