Metadata-Version: 2.4
Name: memobot
Version: 1.0.0
Summary: Google Drive-synchronized floating Post-it memo pad for Windows, macOS, and Linux
Home-page: https://github.com/yourusername/memo-bot
Author: Your Name
Author-email: Your Name <your.email@example.com>
Project-URL: Homepage, https://github.com/yourusername/memo-bot
Project-URL: Bug-Tracker, https://github.com/yourusername/memo-bot/issues
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Topic :: Office/Business :: News/Diary
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Requires-Dist: pywebview>=5.0
Requires-Dist: google-api-python-client>=2.0
Requires-Dist: google-auth-oauthlib>=1.0
Requires-Dist: google-auth-httplib2>=0.1.0
Requires-Dist: pystray>=0.19.0
Requires-Dist: pillow>=10.0.0
Dynamic: author
Dynamic: home-page
Dynamic: requires-python

# Memo-Bot v1.0 📌

구글 드라이브 기반의 완벽히 동기화되는 크로스 플랫폼 포스트잇 메모장입니다.
안드로이드(Flutter)와 데스크톱(Windows, macOS, Linux - Python/PyWebView) 환경을 지원하며, 사용자의 구글 드라이브 **숨겨진 앱 폴더 (Application Data Folder)**를 이용해 보안이 매우 뛰어나고 깔끔한 동기화를 수행합니다.

---

## 🎨 기술 스택 및 특징

* **Desktop Client**: Python + PyWebView (HTML/JS/CSS). OS 내장 웹뷰를 사용하므로 배포 파일 및 메모리 소모가 최소화됩니다.
* **Mobile Client (Android)**: Flutter (Material 3 다크 모드). 모던하고 유려한 포스트잇 리스트 및 편집 인터페이스 제공.
* **Sync Engine**: Google Drive AppData API. 사용자의 파일 목록에 노출되지 않는 고유 앱 저장소를 사용하고, 파일의 `appProperties` 메타데이터를 캐싱하여 트래픽 소모가 매우 적고 반응이 빠른 동기화를 지원합니다.

---

## 📂 데이터 저장 경로 및 파일 포맷

메모를 작성하고 저장하면 각 메모는 로컬 컴퓨터에 개별 **JSON 파일** 형태로 저장됩니다.

### 1. 로컬 저장 경로
* **Windows**: `C:\Users\<사용자명>\.memobot\notes\`
* **macOS / Linux**: `~/.memobot/notes/`

### 2. 파일 형식 및 이름
* 각 메모당 `note_<고유ID>.json` 형식으로 저장됩니다. (예: `note_a1b2c3d4.json`)

### 3. JSON 데이터 구조 예시
메모의 내용, 색상, 좌표 및 크기, 태그 정보뿐만 아니라 첨부된 이미지 데이터까지 단일 JSON 파일 내에 보관합니다.
```json
{
  "id": "a1b2c3d4-...",
  "content": "메모 내용입니다. #태그",
  "color": "yellow",
  "tags": ["태그"],
  "x": 120,
  "y": 250,
  "width": 250,
  "height": 250,
  "is_folded": false,
  "on_top": true,
  "updated_at": "2026-06-04T12:57:08Z",
  "image": "data:image/png;base64,iVBORw0KGgoAAA..." // 첨부된 이미지 데이터 (Base64 인코딩)
}
```

> [!NOTE]
> 구글 드라이브 동기화가 실행되면 구글 드라이브의 숨겨진 앱 전용 저장소(AppData Folder) 폴더에도 로컬과 동일한 파일명 및 JSON 데이터 포맷으로 저장 및 동기화됩니다.

---

## 🔑 구글 드라이브 API 설정 (OAuth 2.0)

양쪽 플랫폼에서 동기화 기능을 활성화하기 위해 Google Cloud Console에서 OAuth 2.0 자격 증명을 설정해야 합니다.

1. **Google Cloud Console 접속**:
   * [Google Cloud Console](https://console.cloud.google.com/)에 구글 계정으로 로그인합니다.
   * 새 프로젝트를 생성합니다 (예: `Memo-Bot`).

2. **Google Drive API 활성화**:
   * **API 및 서비스 > 라이브러리**로 이동합니다.
   * `Google Drive API`를 검색하고 **사용(Enable)** 버튼을 클릭합니다.

3. **OAuth 동의 화면 설정**:
   * **API 및 서비스 > OAuth 동의 화면**으로 이동합니다.
   * User Type을 **외부(External)**로 선택하고 생성을 누릅니다.
   * 필수 정보(앱 이름, 이메일 등)를 입력합니다.
   * **범위(Scopes)** 설정 단계에서 `.../auth/drive.appdata` 범위를 추가합니다 (구글 드라이브의 앱 전용 숨겨진 폴더 읽기/쓰기 권한).
   * **테스트 사용자 (Test Users)** 등록 단계에서 동기화 테스트에 사용할 본인의 구글 이메일을 반드시 추가합니다.

> [!IMPORTANT]
> OAuth 동의 화면의 퍼블리싱 상태가 **테스트(Testing)** 모드인 경우, 테스트 사용자로 이메일 계정이 등록되어 있어야만 구글 로그인이 정상 처리되고 차단 에러(403 access_denied)가 발생하지 않습니다.

4. **사용자 인증 정보(Credentials) 생성**:
   * **API 및 서비스 > 사용자 인증 정보**로 이동합니다.
   * **사용자 인증 정보 만들기 > OAuth 클라이언트 ID**를 클릭합니다.
   * 애플리케이션 유형을 **데스크톱 앱(Desktop App)**으로 선택하고 이름을 입력 후 생성합니다.
   * 생성된 클라이언트 ID의 JSON 파일을 다운로드합니다.

---

## 💻 데스크톱 앱 실행 및 배포 (Python)

### 1. 자격 증명 파일 배치
다운로드받은 클라이언트 비밀번호 JSON 파일을 `client_secrets.json`으로 이름을 변경하여 다음 경로에 저장합니다.
* **Windows**: `C:\Users\<사용자명>\.memobot\client_secrets.json`
* **macOS/Linux**: `~/.memobot/client_secrets.json`

### 2. 개발자 모드 로컬 실행
```bash
cd desktop
# 가상환경 생성 및 활성화
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 의존성 패키지 설치
pip install -e .

# 앱 실행
memobot
```

### 3. PyPI 배포용 빌드 및 업로드
패키지 청소, 빌드, 업로드를 일괄적으로 자동 처리해주는 배치 스크립트가 제공됩니다:
```bash
# Windows 환경에서 빌드 및 배포 배치파일 실행
./publish_pypi.bat
```
* 실행 시 기존 빌드 임시 파일들을 모두 초기화하고, `build` 및 `twine` 모듈을 자동으로 최신 설치/업그레이드한 후 빌드를 수행합니다.
* 빌드 완료 후 **[1] TestPyPI 업로드**, **[2] 공식 PyPI 업로드**, **[3] 업로드 없이 빌드만 수행** 중 하나를 선택해 진행할 수 있습니다.
* 배포 완료 시 사용자는 `pip install memobot` 명령어만으로 크로스 플랫폼(Windows, macOS, Linux) 환경에 설치하고 `memobot` 명령어로 즉시 앱을 실행할 수 있습니다.

---

## 📱 모바일 앱 실행 (Flutter Android)

### 1. Flutter 의존성 구성
```bash
cd mobile
flutter pub get
```

### 2. 안드로이드 플랫폼 설정
구글 로그인 연동을 위해 안드로이드 앱의 패키지명과 디버그 서명 키(SHA-1)를 Google Cloud Console의 동일 프로젝트에 등록해야 합니다.

1. **OAuth 클라이언트 ID 추가 생성**:
   * Google Cloud Console > 사용자 인증 정보 > OAuth 클라이언트 ID 생성.
   * 유형을 **Android**로 선택합니다.
   * 패키지 이름 입력 (예: `com.example.memobot`).
   * 개발용 SHA-1 지문 인증서를 입력합니다 (JDK의 `keytool`을 통해 조회 가능).
2. **서비스 파일 다운로드**:
   * 필요에 따라 Firebase와 결합하여 사용할 경우 `google-services.json`을 `mobile/android/app/` 아래에 배치할 수 있으나, 본 구현에서는 `google_sign_in` 패키지가 클라이언트 ID를 통해 직접 동작하므로 최소한의 설정만으로 작동 가능합니다.

### 3. 앱 실행
```bash
flutter run
```

---

## 🔄 동기화 및 충돌 방지 세부 설계

* **Tombstoning (소프트 삭제)**: 사용자가 앱 내에서 메모를 삭제하면 파일이 즉시 영구 삭제되지 않고 내부 필드가 `is_deleted: true`로 갱신됩니다. 이는 다른 디바이스가 동기화 시점에 해당 메모를 로컬에서도 똑같이 지워주도록 유도하며, 완벽한 삭제 전파를 제공합니다.
* **Last-Write-Wins (최종 쓰기 우선)**: 오프라인 수정을 포함하여 서로 다른 기기에서 같은 포스트잇을 수정한 경우, JSON 내부의 `updated_at` 타임스탬프를 기준으로 더 늦게 편집된 최종 데이터를 기준으로 덮어씁니다.
