# Clippy Roadmap

Clippy는 macOS 메뉴바 기반 클립보드 히스토리 앱이다. Maccy류 앱의 빠른 검색과 키보드 중심 사용성을 참고하되, Jin Factory 고유의 이름, 아이콘, 설정 구조, 문구, 구현으로 만든다.

## Product Positioning

- 로컬 전용 클립보드 히스토리.
- 메뉴바에서 즉시 열고, 검색해서, 다시 클립보드에 가져오는 흐름을 최우선으로 둔다.
- 텍스트, URL, 색상값, 코드 조각, 파일, 이미지처럼 다시 찾을 가능성이 높은 내용을 빠르게 스캔할 수 있어야 한다.
- 광고, 추적, 계정, 구독, 개발자 서버 저장 없이 동작한다.
- 비밀번호 관리자와 민감한 앱은 기본 제외 대상으로 다룬다.

## Phase 1 - MVP Clipboard History

- [x] `utilities/clippy` macOS native SwiftUI/AppKit scaffold 생성.
- [x] Bundle ID `com.jin.clippy` 설정.
- [x] 메뉴바 앱 구조(`LSUIElement`) 적용.
- [x] `NSPasteboard` change count polling 기반 클립보드 감시.
- [x] 텍스트 클립보드 항목 저장, 중복 항목 병합, 최근 사용 순 정렬.
- [x] 히스토리 항목 선택 시 클립보드로 되돌리기.
- [x] 기본 전역 단축키로 검색 패널 열기.
- [x] 앱 재실행 후에도 히스토리 복구.
- [x] 저장 개수 제한과 오래된 항목 자동 정리.
- [x] 기본 저장 개수를 1000개로 제한하고 설정 가능한 최대값도 1000개로 고정.
- [x] 전체 히스토리 용량과 단일 클립 저장 가능 용량을 설정에서 조정하고, 기본값을 각각 100 MB / 10 MB로 제한.

## Phase 2 - Search Panel

- [x] 중앙 floating panel UI 구현.
- [x] 검색 입력 필드가 열림과 동시에 focus 되도록 처리.
- [x] 제목, 본문 preview, source app, 시간 기준 검색.
- [x] 긴 텍스트 검색 성능을 위해 항목 저장/로드/import/title 변경 시 정규화된 검색 인덱스 재생성.
- [x] 키보드 위/아래 이동, Enter 선택, Escape 닫기.
- [x] 선택 항목 클립보드 복사.
- [x] 열린 패널 안에서는 선택 항목 순서를 유지하고 Copied 피드백만 표시, 다음 열림 때 사용 순서 재정렬.
- [x] 검색 패널에서 개별 항목 삭제.
- [x] 옵션으로 선택 후 현재 앱에 바로 붙여넣기 지원.
- [x] 긴 텍스트와 미디어 항목은 한 줄 요약과 하단 선택 preview로 분리.
- [x] URL, 이메일, 색상값, 코드처럼 인식 가능한 항목은 작은 type badge 표시.
- [x] 빈 상태와 검색 결과 없음 상태 제공.

## Phase 3 - Settings

- [x] Cling/Dimmer 스타일의 좌측 사이드바 설정 화면 적용.
- [x] General: 로그인 시 실행, 메뉴바 표시, 선택 후 붙여넣기, 알림음 설정.
- [x] History: 저장 개수, 보존 기간, 중복 병합, 히스토리 전체 삭제.
- [x] Privacy: 제외 앱, 민감 키워드, transient clipboard 무시.
- [x] Shortcuts: 검색 패널 열기 전역 단축키 recorder.
- [x] Storage: 로컬 저장 파일 위치 보기, export/import.
- [x] 설정 변경 즉시 런타임 반영.

## Phase 4 - Privacy And App Rules

- [x] 기본 제외 앱 목록 구성: 1Password, iCloud Keychain 관련 앱, Notes 잠금 입력 흐름 등 검토.
- [x] 사용자가 현재 활성 앱을 제외 목록에 바로 추가할 수 있는 메뉴바 액션.
- [x] password, otp, token, secret 등 민감 키워드 필터.
- [x] 너무 짧거나 너무 큰 클립보드 항목 무시 옵션.
- [x] 파일/이미지/Rich Text 저장 여부를 별도 gate로 제공하고 기본 OFF로 유지.
- [x] Privacy page와 App Store privacy label을 "Data Not Collected" 기준으로 유지.

## Phase 5 - Visual Polish

- [x] GPT Images 2.0으로 메뉴바 `paperclip` 심볼을 형상화하고 Cling/Cloak 계열에 맞춘 미니멀 macOS AppIcon 재생성.
- [x] 메뉴바 심볼은 paperclip/search motif 기반 단색 SF Symbol 톤으로 정리.
- [x] Maccy App Store 스크린샷을 참고해 검색 패널을 compact search + 리스트 + 작은 선택 preview 구조로 정리.
- [x] 설정 화면은 Cling/Dimmer와 같은 6px radius sidebar selection, material sidebar, 조용한 detail pane 톤 유지.
- [x] 메뉴바 아이콘을 더 크게 렌더링하되 status item 폭은 줄여 좌우 점유 영역을 축소.
- [x] Light/Dark mode 대비 검증 스크립트 추가 및 통과.
- [x] App Store screenshot capture script 추가.

## Phase 6 - Release Readiness

- [x] 앱 README와 AGENTS 작성.
- [x] `docs/index.html`과 `docs/privacy.html` 작성.
- [x] 루트 `README.md`, `AGENTS.md`, `infra/main.tf`, `infra/outputs.tf`에 Clippy 등록.
- [x] App Store Connect metadata scaffold 작성.
- [x] Debug build/run script 추가.
- [x] Release archive, upload, TestFlight internal 배포 플로우 검증. 2026-05-21 `com.jin.clippy` Bundle ID 생성, ICLOUD capability 활성화, `Clippy Mac App Store CLI` profile 생성까지 API로 완료. App Store Connect macOS 앱 레코드 생성 후 KVS-only entitlement 구성으로 `build/release/Clippy.xcarchive`와 `build/release/export/Clippy.pkg`를 생성했고, altool validate/upload가 성공했다. 최신 `1.1 (7)` build 7는 `VALID`, `IN_BETA_TESTING` 상태로 internal group `Test`에 배포 완료. 기본 internal tester는 `limsangjin12@gmail.com`, `yulhee8934@gmail.com`.
- [x] App Review notes에 메뉴바 앱 구조와 로컬-only 클립보드 저장 정책 명시.
- [x] 2026-05-29 App Store `1.0 (2)` Guideline 5.2.5 metadata reject 대응. subtitle의 `Mac` 표현을 제거하고 `Clipboard history search` 계열의 platform-neutral subtitle로 39개 ASC locale appInfo metadata를 API 갱신 후 재제출 완료, ASC `WAITING_FOR_REVIEW`.
- [x] 2026-06-01 App Store `1.1 (6)` 재제출. 패널 방향키/Cmd-1~5 단축키, 클릭 복사 동작, SwiftUI-visible 문자열 l10n 검증을 반영하고 build 6를 reviewSubmission `98aff644-c42e-40c8-af5e-e3d2ab1a65bb`로 제출 완료, ASC `WAITING_FOR_REVIEW`.
- [x] 2026-06-09 App Store `1.1 (7)` 재제출. 기존 `1.1 (6)` submission을 취소하고, 패널 흰 모서리 제거, 이미지 썸네일 overflow 수정, 복사 효과음 제거, `en-US` ASC 앱 이름 `Clippy - Manage Clipboard` 대소문자 보정을 반영했다. build 7 delivery UUID `1ba66f3f-64a1-4807-b768-7bc9037a2478`는 `VALID`, `IN_BETA_TESTING`이고 reviewSubmission `f9b715c3-f84c-441e-bfe3-e684e332d95f`로 제출 완료, ASC `WAITING_FOR_REVIEW`.
- [x] 설정 전체를 기본값으로 되돌리는 Reset Settings 액션 추가. 히스토리 JSON은 삭제하지 않는다.

## Later

- [x] 이미지 클립보드 preview와 선택 복원.
- [x] 파일 클립보드 항목 preview와 선택 복원.
- [x] pinned clips.
- [x] 항목별 favorite과 manual title.
- [x] iCloud settings sync. `NSUbiquitousKeyValueStore`로 캡처/프라이버시/히스토리 제한 설정만 opt-in 동기화하고, 클립보드 내용/launch-at-login/메뉴바 표시/전역 단축키는 제외.
- [x] Shortcuts/App Intents 액션: 검색 패널 열기, 캡처 토글, unpinned clips 정리.
- [x] AppleScript dictionary와 command scaffold: 검색 패널 열기, 캡처 on/off/toggle, unpinned clips 정리.
- [x] AppleScript command runtime 검증 자동화. `script/verify_applescript_commands.sh`가 Debug 앱을 빌드하고, Info.plist scriptability 키, `Clippy.sdef` command/class mapping, 앱 내부 `--verify-applescript-commands` self-test를 검증한다. 외부 `osascript` smoke는 `CLIPPY_VERIFY_OSASCRIPT=1`에서만 실행해 macOS Automation/TCC 승인이 필요한 환경과 분리한다.
- [x] 다국어 런타임 문자열과 ASC 39 locale metadata. `Localizable.xcstrings` 106개 키/40개 런타임 locale 과 ASC 39 locale metadata 를 생성하고 `script/verify_localizations.mjs`로 누락/길이 제한을 검증한다.

## Product Rules

- Maccy의 브랜드, 아이콘, 문구, 화면 구성, App Store copy를 복제하지 않는다.
- 클립보드 내용은 사용자의 Mac 안에만 저장한다.
- 개발자 서버, analytics, tracking SDK, 광고 SDK를 넣지 않는다.
- 비밀번호/토큰/OTP로 보이는 값은 저장하지 않는 방향을 기본값으로 둔다.
- 자동 붙여넣기는 편의 기능이지만 기본 동작은 "선택 항목을 클립보드로 되돌리기"로 시작한다.
