# 로드맵 & 기능 설계 (Markdown 뷰어) 프로젝트: **sosomlab-tauri-test1** — GitHub 스타일 Markdown 뷰어 (Tauri 2 + React 19 + TS) 플랫폼: 데스크톱(Windows/macOS) 우선 → 추후 Linux, 모바일(iOS/Android) 이 문서는 누적되는 요구사항/설계 항목과 단계별 구현 대상을 관리한다. (상세 아키텍처는 코드의 `src/sources`, `src/renderer`, `src-tauri/src/providers` 참고) --- ## 핵심 설계 원칙 - **소스 추상화**: 로컬/GitHub/Bitbucket/GitLab을 동일 인터페이스로. - TS: `src/sources/types.ts` `ContentSource` - Rust: `src-tauri/src/providers/mod.rs` `ContentProvider` 트레잇 - 신규 소스 = 인터페이스 구현 + 레지스트리 등록만으로 추가. - **렌더 프로파일 추상화(교체 가능한 렌더링)**: `src/renderer/profiles.ts` - "어떤 방식으로 렌더링할지"를 프로파일로 정의, 툴바에서 선택 전환. - 신규 프로파일(수식/그래프 강화, GitLab, 순수 텍스트 등) 추가만으로 확장. - **토큰/HTTP/FS는 Rust에 격리**(보안). 토큰은 **암호화된 로컬 저장**. --- ## 단계별 구현 대상 (Milestones) ### ✅ M1 — 로컬 뷰어 + 파일트리 (데스크톱) — *구현 완료* - [x] 로컬 폴더/파일 열기 (네이티브 다이얼로그) - [x] 좌측 파일 트리(지연 확장) - [x] GitHub 스타일 렌더링: GFM(표/체크박스/취소선/자동링크) - [x] **언어별 코드 구문 강조** (highlight.js, 라이트/다크 테마 동기화) - [x] 라이트/다크 테마 토글 (github-markdown-css 라이트/다크) - [x] **목차(ToC) 보기** 패널 (헤딩 추출 → 클릭 이동) - [x] 헤딩 앵커/슬러그(rehype-slug + autolink) - [x] 상대 경로 이미지 표시(data URL), 문서 간 .md 링크 이동, 외부 링크 기본 브라우저 - [x] 최근 문서(localStorage 영속화) - [x] **렌더 프로파일 선택 UI**(현재 GitHub 1종, 확장 구조) - [x] **내보내기**: HTML(스타일 인라인), PDF(웹뷰 인쇄) - [x] YAML frontmatter 숨김 처리 ### M2 — 렌더러 확장 - [ ] **수식 렌더링** (KaTeX): `remark-math` + `rehype-katex` (새 프로파일 또는 기본 통합) - [x] **Mermaid 다이어그램/그래프** 렌더링 (코드펜스 `mermaid`) — 지연 로딩(dynamic import), 라이트/다크 테마 동기화, 문법 오류 시 원본 코드 표시. (mermaid, MIT 라이선스) - [ ] GitHub Alerts/콜아웃 (`> [!NOTE]`, `[!WARNING]` 등) - [ ] 각주, 이모지 shortcode - [ ] 추가 렌더 프로파일 예시(예: "수식·다이어그램 강화", "순수 텍스트") - [x] **Mermaid VS Code 스타일** — base 테마 + themeVariables로 VS Code 라이트/다크 팔레트·폰트 적용 - [x] **다이어그램 확대/축소·이동** — 우상단 축소/확대/원래대로 툴바 + 드래그 팬 + Ctrl+휠 줌 - [x] **본문 확대/축소(줌 %)** — CSS zoom으로 글씨·이미지·표 일관 스케일(50~300%, 기본 100). HistoryBar −/%/+ 컨트롤, Ctrl +/-/0, Ctrl+휠. 영속화. (TX/일반텍스트는 기존 글꼴 크기 유지) - [ ] 라이트/다크 정교화, 본문 폭/글꼴 크기 설정 ### M3 — GitHub 원격 소스 - [x] PAT 인증 + **암호화된 로컬 토큰 저장** (AES-256-GCM) - [x] **다중 repository 등록** 및 관리 UI (GitHub 패널) - [x] 저장소·트리 탐색, 원격 .md 열람 (`ContentProvider` github 구현) - [x] 원격 상대 이미지/링크 해석 - [x] **온라인 갱신 감지(blob sha) + 갱신 버튼**(포커스 시 확인) - [x] **조직(Organization) 저장소 목록 보강** — `/user/repos`(affiliation)에 더해 `/user/orgs` → `/orgs/{org}/repos`를 병합(중복 제거). fine-grained PAT(개인 Resource owner)·SSO 미승인으로 조직 저장소가 빠지던 문제 완화 + 토큰 발급 안내 문구 정비(조직용 classic/조직 Resource owner). - [ ] OAuth 디바이스 로그인(추후), 다중 계정, 자동 폴링 옵션, 브랜치 선택 UI ### M4 — 추상화 강화 + 타 저장소 - [ ] Provider 인터페이스 일반화/안정화 - [ ] **Bitbucket** (및 GitLab) provider 추가 - [ ] 소스 종류별 인증 방식 정리 ### M5 — UX 폴리시 & 지식관리 - [x] **외부 인자로 파일/폴더 열기 (Windows, argv)** — `Viewer.exe "문서.md"`/연결 프로그램으로 즉시 열람 (`startup_target` 커맨드). - [x] **외부 인자 열기 macOS 대응** — `bundle.fileAssociations`(Info.plist `CFBundleDocumentTypes`) + `RunEvent::Opened { urls }` 처리(콜드스타트 전역 버퍼 `take_opened_targets` + 실행 중 `open-targets` 이벤트 emit/listen). Finder 더블클릭/"다음으로 열기"/Dock 드래그 지원. - [ ] **🐞 외부 인자 재열기 시 중복 등록·재열림 개선** — 이미 등록된 폴더/열려 있는 문서를 외부 인자로 다시 열면 워크스페이스가 다시 등록(최상단 이동)되고 문서가 재로딩됨. 이미 등록/열려 있으면 **재사용**(중복 등록·불필요한 재로딩 방지)하도록 개선. (`openExternalTarget`/`addWorkspace`) - [ ] **single-instance** — Windows/macOS에서 2번째 실행을 기존 창으로 합치기(추후) - [ ] **검색** — 현재 문서 단어 검색 + 정규식 → 파일명 필터 → 워크스페이스 전체(grep). 설계: [SEARCH.md](SEARCH.md) - [ ] **파일 변경 시 갱신(미사용/변경 알림/자동)** — 자동은 현재 위치 유지. 설계: [AUTO-REFRESH.md](AUTO-REFRESH.md) - [x] **MD/TX 보기 모드 토글** — 새로고침 왼쪽 세그먼트 버튼(1택 그룹, 기본 MD). TX는 원문(일반 텍스트) 보기: 선택/복사, 드래그 중 가장자리 자동 스크롤, Ctrl +/- 글꼴 크기. - [x] **서식 있는 복사(Word/PPT)** — MD 렌더 화면에서 복사 시 computed style을 인라인한 HTML을 `text/html`로 클립보드에 넣어 렌더된 모습 그대로 붙여넣기(`src/lib/richCopy.ts`). - [x] **본문 우클릭 메뉴** — 복사(서식 유지)/텍스트만 복사/문서 전체 복사/전체 선택 (`src/components/ViewContextMenu.tsx`). - [ ] 탭(다중 문서) - [ ] 즐겨찾기(북마크) - [ ] **문서 간 링크 연결 정보 보기**(백링크/링크 그래프) — *요청 반영(설계)* - [ ] **문서별 태그 추가/관리 + 태그 기반 탐색** — *요청 반영(설계)* - [ ] 로컬 파일 변경 감지(라이브 리로드) - [ ] 내보내기 고도화(서버사이드 PDF, 다크 테마 내보내기 옵션) - [ ] 번들 크기 최적화(highlight.js 언어 선별/코드 스플리팅) ### 배포 채널 — 패키지 매니저 등록 — *요청 반영(설계)* - [ ] **Windows — WinGet**: `winget` manifest(YAML) 작성 → microsoft/winget-pkgs PR (또는 `vedantmgoyal/winget-releaser` 액션으로 릴리스 시 자동 제출). 설치 파일 SHA256 필요. - [ ] **Windows — Chocolatey**: `.nuspec` + install 스크립트 패키지 → `choco push`(API 키), 커뮤니티 저장소 심사. - [ ] **macOS — Homebrew**: Cask(`Casks/nexa-markdown-viewer.rb`, dmg URL+sha256) → 탭(tap) 저장소(`homebrew-tap`) 운영 또는 homebrew-cask PR. - 선행 조건: **코드 서명/공증**(미서명 시 다수 매니저 심사·사용자 신뢰 문제), 안정 버전 태깅, 릴리스 자산 체크섬 자동화. - [ ] **포터블 배포(Windows zip)** — 설치 없이 단일 폴더 실행, 데이터(`./data`)를 앱 옆에 보관. 설계: [PORTABLE.md](PORTABLE.md). (포터블 모드 판별 + 데이터/WebView 경로 분기 + CI zip) ### M6 — Git diff 비교 — *요청 반영(설계)* - [ ] 원격 git 소스: 커밋/브랜치 간 md diff 비교 보기 - [ ] 로컬이 git 저장소면 워킹트리/커밋 간 diff 제공 - [ ] diff 전용 렌더(좌우/인라인), 변경 강조 ### M7 — 모바일 - [ ] iOS/Android 빌드·배포 - [ ] 반응형 레이아웃(사이드바/ToC 토글), 터치 UX - [ ] 모바일 보안 저장(Keychain/Keystore) ### M8 — 편집기 (TX 모드) — *요청 반영(설계)* - [ ] **TX 모드에서 문서 편집** — 원문 보기를 편집 가능 에디터로 전환(뷰어→에디터), 저장(Ctrl+S) - [ ] 마크다운 문법 하이라이트, 실행 취소/다시 실행 - [ ] 편집 ↔ MD 미리보기 동기 전환(스크롤 위치 유지) - [ ] 외부 변경 감지와의 충돌 처리([AUTO-REFRESH.md](AUTO-REFRESH.md) 연동) --- ## 요청 반영 추적 (사용자 추가 요구사항) | 항목 | 단계 | 상태 | |---|---|---| | 다른 포맷 지원 위해 렌더링 선택 전환 가능하게 | M1(구조) + M2(프로파일 추가) | M1 구조 완료 | | ToC 보기 | M1 | ✅ 완료 | | HTML/PDF 내보내기 | M1(기본) + M5(고도화) | M1 완료 | | 언어별 코드 하이라이팅 | M1 | ✅ 완료 | | Mermaid 등 다이어그램 | M2 | ✅ 완료(코드펜스 mermaid) | | 문서 간 링크 연결 정보(백링크/그래프) | M5 | 설계 | | 문서별 태그 | M5 | 설계 | | Git diff 비교(원격/로컬 git) | M6 | 설계 | | 이동 기록(파일#앵커)·브레드크럼 | M1 | ✅ 완료 | | 패널 크기조절 + VSCode/Eclipse 토글 | M1 | ✅ 완료 | | 앱 아이콘/파비콘(S 배경+M↓) | M1 | ✅ 완료 | | Linux 빌드(deb/rpm/AppImage) | 배포 | ✅ 완료(CI) | | WinGet / Chocolatey / Homebrew 등록 | 배포 채널 | 설계 | | 외부 인자(파일/폴더)로 즉시 열기 | M5 | ✅ 완료(Windows argv) | | 외부 인자 열기 macOS(파일 연결·Opened 이벤트) | M5 | ✅ 완료(동작 확인) | | 외부 인자 재열기 중복 등록·재열림 개선 | M5 | 🐞 이슈 등록 | | 문서 검색(단어/정규식, 파일명, 전체 grep) | M5 | 설계([SEARCH.md](SEARCH.md)) | | 파일 변경 갱신(미사용/알림/자동·위치유지) | M5 | 설계([AUTO-REFRESH.md](AUTO-REFRESH.md)) | | 포터블 버전(Windows zip) | 배포 채널 | 설계([PORTABLE.md](PORTABLE.md)) | | 기술 구조·호출/동작 흐름 문서화 | 문서 | ✅ 완료([ARCHITECTURE.md](ARCHITECTURE.md)) | | MD/TX 보기 모드 토글(원문 보기) | M5 | ✅ 완료 | | 서식 있는 복사(Word/PPT 붙여넣기) | M5 | ✅ 완료 | | 본문 우클릭 복사 메뉴 | M5 | ✅ 완료 | | TX 모드 편집기(편집/저장) | M8 | 설계 | | 본문 확대/축소(줌 %) | M2 | ✅ 완료 | | Mermaid VS Code 색/폰트 + 다이어그램 줌/팬 | M2 | ✅ 완료 | | 조직(Org) 저장소 목록 표시 | M3 | ✅ 완료(병합 보강) |