Metadata-Version: 2.4
Name: memobot
Version: 1.3.40
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.3.40 📌



구글 드라이브 기반의 완벽히 동기화되는 크로스 플랫폼 포스트잇 메모장입니다.
안드로이드(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` 명령어로 즉시 앱을 실행할 수 있습니다.

### 4. PyPI 패키지 관리 방법 (설치, 업데이트, 삭제)

일반 사용자는 파이썬이 설치된 환경에서 아래의 pip 명령어를 사용해 패키지를 편리하게 관리할 수 있습니다.

* **설치 (Install)**:
  ```bash
  pip install memobot
  ```
* **실행 (Run)**:
  설치 후 터미널이나 명령 프롬프트에서 아래 명령을 실행하면 데스크톱 앱이 실행됩니다 (윈도우 환경에서는 검은색 콘솔창 없이 백그라운드용 앱으로 실행됩니다).
  ```bash
  memobot
  ```
* **최신 버전 업데이트 (Update)**:
  ```bash
  pip install --upgrade memobot
  ```
* **삭제 (Uninstall)**:
  ```bash
  pip uninstall 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
```

---

## 💡 플랫폼별 참고 사항 (macOS / Android / Linux)

### 🍎 macOS (맥) 환경에서의 유의점
* **무설정 즉시 실행**: macOS에는 렌더링 백엔드인 Cocoa `WKWebView`가 OS 레벨에서 완벽하게 내장되어 있어, 추가적인 패키지 설치 없이 `pip install memobot` 후에 즉시 실행 가능합니다.
* **윈도우 전용 스타일 차이**: 작업 표시줄(Taskbar)에서 창 아이콘 숨기기, OS 네이티브 그림자 제거, 윈도우 스타일 강제 변경 등 Win32 API 및 DWM(Desktop Window Manager)을 직접 제어하는 일부 네이티브 최적화 기능은 윈도우에서만 작동하며, macOS에서는 `pywebview` 표준 창 형태로 렌더링됩니다.

### 🤖 Android (안드로이드) 환경에서의 유의점
* **구글 로그인 경고창 우회 (최초 1회)**: 구글 클라우드 콘솔의 OAuth 동의 화면이 [앱 게시 (In Production / 배포)] 상태이지만 아직 구글의 공식 브랜드 검수(Verification)를 완료하지 않았기 때문에, 최초 로그인 시 *"이 앱은 Google의 확인을 받지 않았습니다 (This app isn't verified)"* 경고창이 발생합니다. 이때 당황하지 마시고 **[고급 (Advanced)]** -> **[Memo-Bot(으)로 이동 (안전하지 않음)]**을 클릭하여 로그인을 완료해 주시면 됩니다. (배포 상태이므로 특정 테스트 사용자로 등록하지 않은 계정에서도 연동 및 사용이 가능합니다.)
* **동기화 주기**: 모바일 앱은 과도한 배터리 소모를 방지하기 위해 백그라운드 푸시 동기화를 지원하지 않습니다. 데스크톱에서 수정한 내용을 불러오고 싶을 때, 앱 메인 화면 상단에서 아래로 당겨서 새로고침(Pull to Refresh)하거나 동기화 버튼을 눌러 동적 동기화를 트리거할 수 있습니다.

### 🐧 Linux (리눅스) 환경에서의 유의점
* **웹 렌더러 패키지 설치 필수**: 리눅스 데스크톱 환경에서는 웹 창을 렌더링하기 위해 GTK WebKit2 라이브러리가 필요합니다. `pip` 설치 전 아래 OS 패키지를 먼저 설치해 주세요:
  ```bash
  # Ubuntu / Debian 계열
  sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-webkit2-4.1
  ```

---

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

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

---

## 🚀 업데이트 내역 (Changelog)

### v1.3.40 (2026-06-15)
* **모바일 및 데스크톱 인라인 이미지 호환성 구현**:
  - 데스크톱에 적용된 인라인 이미지 구문(`@[[이미지]]`)을 모바일 앱에서도 동일하게 지원합니다.
  - 모바일 목록 카드의 본문 내에 이미지가 포함된 경우 텍스트 영역 내에 `WidgetSpan`을 사용해 인라인으로 렌더링하고, 에디터에서 이미지 첨부 시 `@[[이미지]]` 태그를 커서 영역에 자동으로 삽입합니다.
  - 이미지 삭제 시 본문 내 `@[[이미지]]` 태그가 자동으로 함께 정리되도록 개선하였습니다.
  - 외부 공유 수신 시 이미지 메모에 `@[[이미지]]` 태그를 기본 삽입하도록 연동했습니다.
* **단축키 커스텀 설정 및 중복 방지 기능 완성**:
  - 설정 화면에서 단축키를 실시간으로 지정 및 변경 가능하며, 중복 단축키 입력을 차단하는 기능을 탑재했습니다.
  - 단축키 안내 창 및 매니저 팝업 가이드에 변경된 사용자 단축키 정보가 실시간으로 동적 연동되도록 완료했습니다.
  - 대시보드의 태그 필터 "전체" 버튼 미동작 오류 및 항상위 툴팁 겹침 현상을 해결하고 설정창의 높이를 860px로 확대하여 사용성을 증대했습니다.

### v1.3.39 (2026-06-14)
* **단축키 매니저 동적 연동 및 다국어 갱신**:
  - 단축키 및 본문 이미지 삽입 안내 창을 다국어로 추가 갱신하고 단축키 매니저 크기를 확대하였습니다.

* **버전 변경 시 단축키 팝업 자동 리셋**:
  - 앱 버전이 변경되면 7일 비표시 설정을 무시하고 단축키 안내 팝업이 무조건 표시되도록 개선했습니다.
  - `localStorage`에 마지막으로 팝업이 표시된 버전을 저장하여 버전 변경 여부를 감지합니다.
  - Python API `get_app_version()`을 추가하여 JS에서 현재 앱 버전을 조회할 수 있도록 했습니다.

### v1.3.37 (2026-06-14)
* **단축키 팝업 복구, 매니저 창 배치 및 높이 최적화, 새 메모 팝업 위치 개선**:
  - 대시보드와 분리되어 독립적으로 뜨던 단축키 안내 팝업창을 다시 매니저 창 내부의 모달 팝업 레이아웃으로 변경했습니다.
  - 매니저 대시보드 창의 기본 높이를 600px에서 750px로 충분히 높여 내부 팝업창이 내용을 많이 가리지 않도록 사용성을 개선했습니다.
  - 매니저 창이 실행될 때 화면의 정중앙에 뜨도록 배치 좌표 계산을 연동했습니다.
  - 새 메모를 추가하거나 생성할 때 화면 중앙이 아닌 화면의 우측 영역(가장자리 방향) 중앙에 팝업되도록 자동 배치 좌표를 개선하여 화면 가림을 최소화했습니다.

### v1.3.36 (2026-06-14)
* **모바일 버전 메모 편집기 툴바 오버플로우 문제 해결 및 버전 표시 동기화**:
  - 모바일 기기(Android 에뮬레이터 등)에서 메모 편집 창(`_NoteEditorSheet`)을 열었을 때 상단 툴바가 가로로 넘쳐 `RIGHT OVERFLOWED BY 40 PIXELS` 레이아웃 오류가 발생하던 문제를 수정했습니다.
  - 기존 단일 행 구성을 **'테마 색상 선택 행'**과 **'액션 버튼 행'**의 2단 레이아웃으로 분리했습니다.
  - 모든 액션 아이콘 버튼(저장 체크 버튼 포함)에 `visualDensity: VisualDensity.compact`, `constraints: BoxConstraints()`, `padding: EdgeInsets.all(6)` 속성을 균일하게 적용하여 모바일 기기 가로 해상도(320dp 이상)에서 오버플로우 없이 렌더링되도록 수정했습니다.
  - 모바일 버전 헤더의 버전 표시를 하드코딩된 `V1.2`에서 빌드 버전인 `V1.3.36`으로 동기화했습니다.

### v1.3.35 (2026-06-11)
* **입력 플러그인 파일 선택 모달 및 매니저 접힘/펼침 그룹 정렬 수정**:
  - Windows 환경의 설정 창에서 "입력 플러그인 설정" 시, 폴더 버튼을 눌러도 파일 선택 모달창(create_file_dialog)이 뜨지 않고 invalid file filter (*.py) 에러가 발생하던 PyWebView 버그 수정.
  - 관리자 대시보드 창에 접힌 메모와 펼친 메모를 구획하여 깔끔하게 정리해주는 "그룹 정렬 레이아웃 모드" 버튼 및 지속 설정 상태 연동 추가.

### v1.3.34 (2026-06-11)
* **단축키 및 본문 액션 고도화 & 관리자 레이아웃 버그 수정**:
  - Windows 환경에서 언제 어디서든 새 메모를 추가할 수 있는 전역 단축키(`Ctrl+N`) 구현 (설정 화면에서 개별 단축키 활성화 여부 실시간 연동).
  - 메모 창 헤더 좌측에 새 메모를 마우스 클릭으로 바로 열 수 있는 `+` 아이콘 추가.
  - 메모 본문 우측 상단에 메모 전체 내용을 클립보드로 복사하는 플로팅 복사 버튼 추가 (선택 색상 테마에 맞춰 투명도와 회색 색감이 조화롭게 자동 보정되며, 복사 성공 시 시각 피드백으로 체크 아이콘(`✓`) 일시 표시).
  - 기본 예제 플러그인 3종(`datetime_plugin`, `meeting_minutes_plugin`, `book_search_plugin`)에 메모봇 설정 언어(한국어, 영어, 일본어, 중국어)를 동적으로 감지하여 표시하는 다국어 지원 설계 적용.
  - 관리자 창에서 탭을 전환했다가 로컬 메모 탭으로 되돌아올 때 Grid 바둑판 정렬 레이아웃이 깨지고 일렬로 포개지던 CSS/JS display 초기화 버그 해결.

### v1.3.33 (2026-06-11)
* **플러그인 폴더 격리 및 기능 고도화**:
  - 플러그인 저장 폴더를 실행 파일 경로 기준의 `plugins` 폴더로 고정.
  - 설정 메뉴(Settings)에서는 최대 5개의 플러그인을 슬롯에 지정(등록)할 수 있도록 제한 유지.
  - 메모 창의 플러그인 메뉴(Popover) 및 인라인 키워드 단축 커맨드(`//triggerName//`) 입력 시, `plugins` 폴더 내에 위치한 모든 플러그인을 동적으로 감지하여 사용할 수 있도록 개선.
  - 슬롯 등록 시 외부 경로 파일을 선택하면 자동으로 `plugins` 폴더로 복사 및 파일명 기반으로 등록되도록 개선.

### v1.3.32 (2026-06-11)
* **입력 플러그인(Input Plugin) 시스템 탑재**:
  - Python 클래스 기반의 플러그인 동적 로더 및 실시간 핫리로드 기능 구현.
  - 단순 텍스트 삽입/가공형(`text`), 대화형 입력 마법사 폼(`form`), 실시간 외부 API 도서 검색(`search`)의 3가지 핵심 플러그인 스키마와 기본 샘플 플러그인 3종 배포.
  - 메모 에디터 내에서 `//triggerName//` 인라인 입력을 통해 플러그인을 단축 호출하는 실시간 감지 기능 구현.
  - 플러그인 서식 삽입 시 `{{placeholder}}` 탭 이동 및 블록 지정 지원 (Tab-stop Placeholder Navigation).

### v1.3.31 (2026-06-11)
* **모바일 및 데스크톱 10색 테마 컬러 팔레트 동시 확장**:
  - 기존 5색에서 주황(Orange), 민트(Teal), 장미(Rose), 라벤더(Lavender), 회색(Gray)의 5가지 세련된 파스텔 톤 색상을 추가하여 총 10가지 색상을 지원하도록 데스크톱과 모바일 앱(Flutter)을 동시 갱신했습니다.
  - **데스크톱 색상 선택 UI 간소화**: 가로로 5개 나열되던 색상 버튼들을 1개의 파레트 아이콘 버튼으로 축소하고, 클릭 시 10색의 컬러칩이 바둑판 배열로 깔끔하게 열리는 팝오버(Popover) 드롭다운 창을 구현했습니다.
  - **모바일 앱(Flutter) 호환성 및 테스트 안정화**: 모바일에서도 10색이 가로 스크롤로 선택 가능하며, Flutter Analyzer 및 기존 widget_test.dart 소스 내의 빌드 에러를 완벽히 해소했습니다.
* **엣지탭 겹침 현상 정밀 제어 및 핸들 감지 예외 처리**:
  - Windows의 DWM 그림자 마진 또는 보이지 않는 테두리 픽셀 오차로 인해 발생하던 엣지탭(Edge Tab)의 상하/좌우 미세 겹침 버그를 4px의 물리적 정렬 간격 버퍼(`spacing = 4`)를 적용하여 완벽하게 해소했습니다.
  - 크기 조절이나 고정 기능을 누르지 않고 즉각 엣지탭을 사용할 경우에도 윈도우 핸들(`hwnd`)이 즉각 해상화(Resolution)되어 오차 없이 스냅되도록 백엔드 안전 장치를 병합했습니다.
* **메모 가로폭 크기 조절 일관성 통일**:
  - 메모를 접었을 때와 폈을 때 조절할 수 있는 가로폭의 최솟값을 `140px`로 상호 일치시켜 접기/펴기 상태 전환 시의 레이아웃 어긋남을 최적화했습니다.

### v1.3.30 (2026-06-11)
* **화면 가장자리 도킹 기능의 정식 명칭을 '엣지탭(Edge Tab)'으로 명명 및 기능 고도화**:
  - 화면 좌측, 우측, 상단 가장자리에 드래그 시 책갈피 색인 모양으로 달라붙는 스냅 기능을 **'엣지탭(Edge Tab)'**으로 공식 정의했습니다.
  - **좌/우측 사이드 엣지탭 라벨 가독성 고도화**: WebView2 렌더링 엔진에서 90도 회전 시 폰트가 깨지거나 생략되는 문제를 해결하기 위해, 그레이스케일 안티앨리어싱 및 3D GPU 가속 옵션을 연동하여 글자가 매우 깨끗하고 선명하게 렌더링되도록 개선했습니다.
  - **폰트 스타일 콤팩트 최적화**: 엣지탭의 라벨 크기를 `11px`, 세미볼드(`font-weight: 600`)로 축소 및 미니멀하게 설계하여 깔끔한 외관을 완성했습니다.
  - **오리지널 단색 테마 및 고대비 색상 유지**: 투명도 제거와 함께 메모장 본연의 오리지널 솔리드 컬러를 그대로 적용해 일체감을 극대화했습니다.
  - **엣지탭 겹침 방지 (Non-Overlapping Snap)**: 여러 개의 메모가 동일한 엣지 영역에 도킹될 때, 물리적으로 겹쳐지지 않고 비어 있는 가장 가까운 공간에 순차적으로 정렬되도록 충돌 방지 공간 분배(Interval Snap) 로직을 연동했습니다.

### v1.3.28 (2026-06-09)
* **다국어 설정 화면 번역 매핑 버그 수정**:
  - 설정 창의 일부 옵션(프로그램 실행 설정, OS 시작 시 자동 실행, 사용할 모델 등)의 data-i18n 속성이 중복되거나 잘못 지정되어 일어 등 다른 언어 선택 시 라벨 텍스트가 엉뚱한 내용으로 출력되던 오류를 개별 매핑 키 신설을 통해 해결했습니다.

### v1.3.27 (2026-06-09)
* **다국어 설정 및 실시간 번역 동기화**:
  - 설정 메뉴에 "언어 설정 (Language)" 드롭다운을 추가하고, 한국어, 영어, 중국어, 일어, 러시아어, 프랑스어, 이탈리아어 7개 국어 팩 지원을 신설하였습니다.
  - 사용자가 언어 설정을 변경하면 메인 대시보드 및 떠 있는 모든 스티커 메모 창에 새로고침 없이 실시간으로 다국어 번역이 전파 및 갱신되도록 개선하였습니다.
  - 빌드(PyInstaller) 및 배포 패키지 구성에 언어 리소스(`languages/*`)가 누락되지 않도록 동적 런타임 경로 해결 및 설정을 보완하였습니다.
* **초소형 메모 창 잠금 해제/닫기 버튼 잘림 문제 개선**:
  - 스티커 창의 세로 높이가 180px 이하로 좁아졌을 때, 비밀번호 입력 및 확인창의 잠금 아이콘을 숨기고 요소를 가로(row)로 컴팩트하게 정렬하는 반응형 CSS 고도화를 통해 해제/닫기 버튼이 보이지 않거나 잘리지 않도록 완벽히 대응하였습니다.

### v1.3.26 (2026-06-09)
* **한글 입력 상태에서의 글로벌 단축키 작동 실패 버그 해결**:
  - 개별 메모 스티커 창이나 매니저 대시보드 내에서 한글 입력 모드로 설정되어 있을 때, `Ctrl+L`(접기/펴기), `Ctrl+D`(삭제), `Ctrl+P`(고정), `Ctrl+N`(새 메모), `Ctrl+S`(동기화) 등의 단축키가 작동하지 않던 치명적인 문제를 해결했습니다.
  - 브라우저 keydown 이벤트의 `e.key` 판별 외에 키보드의 물리적 위치를 나타내는 `e.code` 판별 검사를 병합하여 입력 상태에 100% 무관하게 단축키가 즉각 실행되도록 보완했습니다.

### v1.3.25 (2026-06-08)
* **관계 그래프 내 'AI 연결 추천' 메뉴 및 자동 위키링크 연동 기능 신설 (PyPI 배포 완료)**:
  - 관계 그래프(Relationship Graph) 상단에 [AI 연결 추천] 버튼을 새로 배치하고, 이를 통해 의미론적인 관련성은 깊지만 아직 위키링크(`[[ ]]`)로 연결되지 않은 메모 쌍을 AI 분석(Gemini / Ollama)을 통해 추천받는 전용 인터페이스를 구현했습니다.
  - 비동기 분석 중에는 세련된 글래스모피즘 스피너 로더가 진행 상황을 안내하며, AI가 탐색해 낸 연관 메모 리스트와 추천 이유를 전용 모달 창에 정렬하여 시각화합니다.
  - [연결 적용] 클릭 시 백엔드 단에서 대상 메모 파일 내용 끝자락에 `[[대상메모]]` 위키링크를 깔끔하게 추가합니다.
  - 적용 완료 시 대시보드 관계 그래프와 열려 있는 모든 스티커 메모 창이 실시간으로 동기화되어 즉시 화면에 실선이 연결되고 텍스트가 갱신됩니다.
  - **PyPI 배포**: 본 릴리즈 버전은 [PyPI memobot v1.3.25](https://pypi.org/project/memobot/1.3.25/) 패키지로 성공적으로 업로드 및 배포 완료되었습니다.

### v1.3.24 (2026-06-08)
* **메무 매니저(대시보드) 실행 시 단축키 안내 팝업 신설**:
  - 앱의 핵심 편의 기능인 퀵메모 HUD 단축키(`Ctrl+Shift+Space`), 매니저 창 복원 단축키(`Ctrl+O`) 및 각종 에디터 단축키를 사용자가 보다 직관적으로 파악할 수 있도록 대시보드 팝업창을 구현했습니다.
  - 팝업창 하단에 **[7일 동안 이 팝업 보지 않기]** 체크박스를 얹어, 체크 후 승인 시 `localStorage` 캐시 만료 시간을 7일 후로 연장하여 번거로움을 덜어주는 스마트 상태 관리를 제공합니다.

### v1.3.23 (2026-06-08)
* **관계 그래프 드래그 시 발생하는 물리 궤도 공전(회전) 억제**:
  - 드래그 동작 중에 노드들이 어떤 한 중심점을 축으로 뱅글뱅글 맴돌거나 공전하려는 물리 법칙의 문제(구심력 과다 및 감쇠율 부족)를 해결했습니다.
  - 구심력 옵션(`centralGravity`)을 `0.01`로 극소화하여 공전 현상의 근본 원인을 없앴습니다.
  - 운동 에너지의 감쇠를 지배하는 `damping` 계수를 `0.09`에서 `0.85`로 극대화하여 물리학적 점성을 크게 주었습니다. 이로써 드래그를 멈추거나 노드를 놓았을 때 춤추듯 회전하지 않고 관성이 즉각 상쇄되어 스무스하게 정지합니다.
  - 연결선 탄성 계수(`springConstant`)와 척력 계수(`gravitationalConstant`)를 완화하여 노드들이 지나치게 튕겨나가지 않도록 미세 조정했습니다.

### v1.3.22 (2026-06-08)
* **관계 그래프 무한 공전/진동 예방 방식 강화**:
  - 시뮬레이션 안정화(`stabilized`) 이벤트가 수렴하지 않는 루프(예: 순환 참조 구조)에서는 아예 발생하지 않는 특성이 있어 여전히 도는 문제가 있었습니다.
  - 이를 근본적으로 방지하기 위해, 그래프 로드 시 2초(2000ms) 후에 강제로 물리 연산을 정지시키는 강제 타이머를 추가했습니다.
  - 또한 드래그가 끝난 시점(`dragEnd`)에서도 1초(1000ms)의 관성 여유를 준 뒤 강제로 물리를 비활성화하여, 최종 위치에 온전히 고정되도록 제어를 더욱 견고히 개선했습니다.

### v1.3.21 (2026-06-08)
* **관계 그래프 무한 공전/진동 현상 해결**:
  - 관계 그래프가 물리 엔진 연산에 의해 계속 회전 및 공전하며 진동하는 버그를 해결하기 위해, vis.js Network 시뮬레이션 안정화(`stabilized`) 및 드래그 종료(`dragEnd`) 시점에 물리 효과(`physics: false`)를 끄고 그 자리에 노드들을 고정시키도록 개선했습니다.
  - 드래그 시작(`dragStart`) 시점에는 다시 물리를 켜서 연결된 노드들이 상호작용하며 끌려오도록 자연스럽게 연동했습니다.

### v1.3.20 (2026-06-08)
* **대시보드 해시태그 필터 접기/펴기 기능 및 구문 오류 해결**:
  - **해시태그 필터 토글**: 대시보드 메인 화면 상단 검색창 옆에 해시태그 필터 영역 `#필터`을 온/오프할 수 있는 토글 버튼을 추가하여, 태그 개수가 늘어나 창을 많이 차지하는 시각적 피로감을 개선했습니다.
  - **필터 상태 영속화**: 접힘/펼침 상태가 `localStorage`를 통해 브라우저 캐시에 영속적으로 저장되어, 앱 재실행 및 새로고침 시에도 이전 설정이 그대로 복원됩니다.
  - **app.js 구문 오류 수정**: 토글 스크립트 결합 시 발생하던 괄호 구문 에러를 해결하여 런타임 안정성을 확보했습니다.

### v1.3.19 (2026-06-08)
* **신규 편의 기능 3종 구현 완료**:
  - **글로벌 퀵 캡처 HUD (데스크톱 전용)**: `Ctrl+Shift+Space` 단축키로 정중앙에 미니 글래스모피즘 입력창을 띄워 1초 만에 새 메모를 기록하는 퀵 캡처 팝업 기능을 추가했습니다.
  - **위키링크 관계 그래프 뷰 (데스크톱 전용)**: Vis.js 기반 물리 엔진을 연동하여, 메모들 간의 위키링크(`[[대상]]`) 참조 관계를 연결선(Edge)과 노드(Node) 형태의 시각적 인터랙티브 맵으로 제공합니다. 노드 더블클릭 시 해당 메모 창이 즉시 열립니다.
  - **AI 스마트 태그 추천 & 한 줄 요약 (데스크톱/모바일 공통)**: AI 분석을 통해 본문 내용에 부합하는 해시태그를 자동 추천하고, 50자 내외의 요약문(`summary` 필드)을 생성 및 저장합니다. 대시보드 카드 뷰에서 한 줄 요약 이탤릭 배지를 표시하며, 데스크톱과 모바일 간 완벽히 동기화됩니다.

### v1.3.18 (2026-06-07)
* **타 기기 실행 오류 및 호환성 대폭 개선**:
  - **WebView2 런타임 누락 예외 처리**: Windows 10/11 환경에서 Microsoft Edge WebView2 Runtime이 미설치/손상되어 앱이 즉시 종료되던 문제를 보완하여, 구동 실패 시 알림창을 띄우고 설치 페이지로 바로 연결해주는 네이티브 다운로드 가이드를 추가했습니다.
  - **64비트 Windows 크래시(Access Violation) 방지**: 64비트 OS에서 `SetWindowLongW` API 호출 시 핸들 포인터(HWND)가 절단되어 프로그램이 비정상 종료되던 버그를 자동 아키텍처 판별을 통해 `SetWindowLongPtrW` 호출로 교체하여 해결했습니다.
  - **PyInstaller hiddenimports 누락 보완**: `webview.platforms.winforms`, `pystray`, `PIL`, `ctypes`, `winreg` 등 런타임 렌더링 드라이버 및 필수 모듈들을 실행 바이너리에 확실히 동봉하여 환경 제약 없는 구동을 확보했습니다.
  - **하드코딩된 개발자 계정 경로 제거**: 가이드 내 특정 개인화 경로를 플레이스홀더 및 동적 계정명 감지(API 브릿지 `get_secrets_path()`) 형태로 변경하여 가독성을 높였습니다.

### v1.3.17 (2026-06-07)
* **작은 메모 크기에서의 확인창(오버레이) 잘림 현상 해결**:
  - 메모 창의 높이가 대폭 작아진 상태에서 잠금 해제 비밀번호 입력 오버레이나 삭제 확인 팝업 등이 뜰 때, 하단의 확인/취소 버튼이 창 하단부 밖으로 밀려나 보이지 않던 잘림 버그를 수정했습니다.
  - 창의 높이가 240px 이하가 되면 팝업 상자의 여백(padding/gap), 글꼴 크기, 아이콘 크기 등을 대폭 슬림하게 조정하는 반응형 미디어 쿼리를 추가하고, 스크롤 가능하도록 레이아웃을 보완했습니다.

### v1.3.16 (2026-06-07)
* **비밀번호 수정 시 기존 비밀번호 검증 단계 추가**:
  - 설정 메뉴에서 잠금 비밀번호를 새로 수정하거나 해제하려고 할 때, 타인이 함부로 접근해 변경하지 못하도록 **기존 비밀번호 입력 확인** 대화상자를 필수적으로 거치도록 설계했습니다.
  - 이 기능은 데스크톱 설정 창(JS `prompt` 다이얼로그) 및 모바일(Flutter Android overlay) 양쪽 모두에 공통 적용되었으며, 검증에 통과해야만 새 비밀번호로의 저장이 승인됩니다.

### v1.3.15 (2026-06-07)
* **메모 비밀번호 잠금 기능 추가 (크로스 플랫폼 연동)**:
  - 데스크톱 및 모바일(Android) 양쪽 앱 모두에 개별 메모 비밀번호 잠금 기능을 도입했습니다.
  - 설정 메뉴에서 사용할 잠금 비밀번호를 개별 기기에 지정할 수 있으며(비밀번호는 동기화되지 않고 각 기기별 로컬 보안 설정에만 독립 저장), 에디터 툴바에 새로 배치된 자물쇠 토글 버튼을 통해 특정 메모를 잠그거나 해제할 수 있습니다.
  - 보안을 위해 잠긴 메모는 대시보드 리스트에서 마스킹(`🔒 잠긴 메모입니다.`) 처리되고, 실제 본문 콘텐츠와 미디어 데이터(이미지/오디오)는 검증 완료 전까지 백엔드와 클라이언트 단 모두에서 완전히 차단되어 유출을 방지합니다.
  - 메모의 잠금 여부 상태(`is_locked`)는 구글 드라이브 동기화를 통해 양방향으로 자동 연동 및 공유됩니다.

### v1.3.14 (2026-06-07)
* **설정 창 독립 팝업 분리**:
  - 기존 메모 매니저(Dashboard) 내부 레이어 모달로 띄우던 설정 창을 독립된 별도 외부 팝업 창(크기 `450x620` 고정, 타이틀바를 가진 윈도우)으로 분리하여 오픈하도록 개선했습니다.
  - 이를 통해 매니저 창의 크기 제한으로 인해 설정 메뉴 하단 및 우측 항목들이 화면에서 잘리는 현상을 완벽히 해결했습니다.
  - 기존 설정 API 및 이벤트 구조를 그대로 이식 및 활용하여 설정 변경사항이 로컬 메모, 매니저, 개별 메모 윈도우에 실시간으로 즉시 동기화됩니다.

### v1.3.13 (2026-06-07)
* **자석 정렬 드래그 개선 및 불필요한 로그/경고 제거**:
  * 접힌 메모가 자석(Magnetic) 정렬 상태로 달라붙어 있을 때 마우스 드래그를 통해 매끄럽게 떼어낼 수 없던 현상을 해결하기 위해, 누적 마우스 움직임을 추적하는 **논리적 좌표계(Logical Coordinates)** 시스템을 도입했습니다. 이제 자석 고정점으로부터 마우스를 15px 이상 이동하면 부드럽고 자연스럽게 스냅이 풀리며 이동할 수 있습니다.
  * 구글 드라이브 동기화 API 초기화 시 터미널에 불필요하게 출력되던 `file_cache is only supported with oauth2client<4.0.0` 경고 메시지를 `cache_discovery=False` 설정을 통해 억제하고 초기화 동작을 최적화했습니다.

### v1.3.12 (2026-06-07)
* **위키링크 포맷 수정 및 작업 표시줄 개별 메모 노출 방지**:
  * 위키링크 복사 시 기존 ID 및 제목 조합 방식(`[[noteId|Title]]`)에서 대중적이고 명확한 `[[NoteTitle]]` 형태로 복사되도록 수정한 후, 메모 본문 파싱 및 클릭 네비게이션 시에도 대괄호 기호(`[[`, `]]`)를 자동 제거해 올바르게 매칭되도록 보완했습니다.
  * Windows 환경에서 개별 포스트잇 메모 창들이 작업 표시줄(Taskbar)에 우후죽순 생성되는 현상을 차단하고, 오직 메인 "메모 관리자(Memo-Bot Manager)" 대시보드 창만 작업 표시줄에 노출되도록 스타일링(`WS_EX_TOOLWINDOW` 및 `ShowInTaskbar = False`)을 수정하였습니다.

### v1.3.11 (2026-06-07)
* **해시태그/위키링크 검색 및 위키링크 복사 기능 추가**: 대시보드 메인 화면에서 `#태그` 검색어 또는 `[[위키링크]]` 검색어 패턴을 인식하는 지능형 필터링 기능을 추가했습니다. 또한 개별 메모 헤더에 "위키링크 복사" 단추를 새로 배치하여 클릭 시 `[[noteId|Title]]` 포맷의 마크다운 링크가 원터치로 클립보드에 복사되고, 성공 시 체크 아이콘으로 1초간 시각적 피드백(플래시 애니메이션)을 주도록 사용성을 강화했습니다.

### v1.3.10 (2026-06-06)
* **백그라운드 실행(noconsole) 기본화**: PyInstaller 빌드 시와 PyPI 패키지 배포 시 윈도우 환경에서 터미널 창 없이 백그라운드용 GUI 앱으로 즉시 실행되도록 설정을 최적화했습니다 (`--noconsole` 및 `gui_scripts` 적용).

### v1.3.9 (2026-06-06)
* **메모 관리자 초기 로드 및 레이스 컨디션 해결**: 매니저 창 첫 실행 시 `window.pywebview` 객체가 아직 브라우저에 생성되지 않았을 때 웹 모드로 성급하게 차단되어 로컬 메모 목록이 화면에 나타나지 않던 문제를 해결하기 위해, `pywebviewready` 이벤트 리스너 등록 및 대기 로직을 전면 최적화하여 안정적으로 로컬 메모를 초기 화면에 로드합니다.

### v1.3.8 (2026-06-06)
* **대시보드 초기화 시 로컬 메모 자동 로드 수정**: 앱 실행 시 `pywebviewready` 이벤트가 리스너 등록 전에 이미 호출되어 대시보드가 처음 켜졌을 때 로컬 메모 목록이 자동으로 나타나지 않던 문제를 수정했습니다. 이제 웹뷰 API 로드 여부를 즉시 검사하여 메모 로딩이 바로 실행됩니다.
* **임포트 오류 수정 (NameError: time)**: 닫기 지연 처리(`defer_hide`) 함수 내에서 `time.sleep` 호출 시 `time` 모듈이 글로벌 임포트되어 있지 않아 발생하던 NameError 버그 및 이로 인해 닫기 동작이 아예 불가능해지던 오동작을 수정했습니다.

### v1.3.7 (2026-06-06)
* **구글 드라이브 탭 목록 레이아웃 개선 및 미리보기 수정**: 구글 클라우드 메모 관리 테이블에서 첫 번째 열(메모 미리보기)의 너비가 다른 열의 고정 너비로 인해 극도로 축소되어 `#...`이나 `메...`처럼 한 글자와 말줄임표로만 보이던 문제를 해결했습니다. 열 비율을 고정하는 대신 유연하게 설정하고 반응형 레이아웃을 도입하였으며, 마크다운 헤더 기호(예: `## `, `# `)를 제외하고 출력하도록 텍스트 전처리 기능을 추가했습니다.

### v1.3.6 (2026-06-06)
* **메모 관리자 창 닫기 무한 루프 버그 수정**: Windows 환경에서 메모 관리자 창을 닫아 트레이 아이콘으로 숨길 때, pywebview의 `hide()` 동작이 내부적으로 `closing` 이벤트를 재발하여 무한 닫기 루프(윈도우가 열리자마자 바로 사라지는 현상)가 발생하는 현상을 방지하기 위해 상태 락(is_hiding_manager)을 도입하여 예외 처리했습니다.

### v1.3.5 (2026-06-06)
* **구글 드라이브 메모 첫 줄 미리보기 지원**: 로컬에 다운로드되지 않은 클라우드 전용 메모도 대시보드의 클라우드 탭 목록에서 본문 첫 줄 내용을 미리 짧게 볼 수 있도록 개선했습니다. 이를 위해 동기화 시 메모의 첫 줄 텍스트를 드라이브 파일의 `appProperties` 메타데이터에 함께 실어 보내고, 목록 렌더링 시 이를 파싱해 출력하도록 연동했습니다.


### v1.3.4 (2026-06-06)
* **단축키 범위(Scope) 최적화**: 새 메모 추가(`Ctrl+N`) 및 동기화(`Ctrl+S`) 단축키가 메모 관리자 대시보드가 열리고 포커스되었을 때만 작동하도록 범위를 가두고, 개별 메모 삭제(`Ctrl+D`), 항상 위 토글(`Ctrl+P`), 접기 토글(`Ctrl+L`)은 개별 메모 창이 활성화되어 있을 때만 반응하도록 개선하여 단축키 충돌을 방지했습니다.
* **글로벌 단축키 지원 (Windows)**: 관리자 창이 닫혀 있거나(트레이 아이콘 상태) 백그라운드에 있을 때도 언제든지 `Ctrl+O`를 누르면 메모 관리자가 최상단으로 복원 및 강제 포커싱되도록 Windows API(RegisterHotKey)를 연동한 글로벌 단축키 스레드를 적용했습니다. 설정에서 단축키를 비활성화하면 시스템 등록도 실시간 해제됩니다.


### v1.3.3 (2026-06-06)
* **버튼 미니멀화 및 도움말 가이드 추가**: 대시보드 제어 버튼을 슬림하고 미니멀하게 디자인을 조정하고, 해시태그, 메모링크(WikiLinks), AI(Gemini) 설정 및 사용법을 상세 안내하는 도움말 가이드 모달을 탑재했습니다.

### v1.3.2 (2026-06-06)
* **Gemini API 키 다중 입력 UI 개선**: 단일 입력창에 쉼표로 길게 나열해야 했던 기존 방식 대신, 설정 창에서 한 칸에 키 하나씩 깔끔하게 등록할 수 있도록 다중 키 동적 추가(`+`)/삭제(휴지통) 인터페이스를 구현했습니다. 기존 백엔드 자동 키 순환(rotation) 알고리즘과 100% 하위 호환됩니다.

### v1.3.1 (2026-06-05)
* **옵디시언 스타일 위키링크 `[[ ]]` 연동**: 메모 본문 내 대괄호 링크(`[[메모 제목]]`) 클릭 시 해당 메모 창을 즉시 포커스하고, 메모가 없는 경우 자동으로 첫 줄 제목을 가진 신규 메모를 생성해 연동해주는 WikiLinks 기능을 탑재했습니다.
* **구글 드라이브 삭제된 메모 완전 삭제**: 구글 드라이브와 동기화 시, 이미 소프트 삭제(Tombstone) 처리된 삭제 대기 메모가 동기화 목록에 남아 잔존하는 현상을 방지하도록 원격 및 로컬에서 영구 삭제 처리하는 루틴을 보강했습니다.
* **기본 웰컴 메모 비활성화**: 앱 처음 실행 시 로컬 저장소에 기본으로 생성되던 2개의 튜토리얼 성격의 가이드 메모가 생성되지 않도록 수정하여 더 깔끔한 시작 화면을 제공합니다.
* **날짜 포맷 변경**: 메모 생성 및 업데이트 시, 시간(시/분/초) 정보만 노출되던 화면에 년-월-일 정보가 함께 노출되도록 날짜 표시 포맷을 수정했습니다 (`YYYY-MM-DD HH:MM:SS`).
* **필터 초기화 자동화**: 해시태그나 메모 내용을 수정한 후 저장 시, 편집한 메모가 현재 검색 또는 태그 필터 때문에 보이지 않는 현상을 방지하기 위해 필터를 자동으로 '전체'로 초기화하여 방금 수정한 메모가 대시보드에 즉시 노출되도록 개선했습니다.
* **슬림 카드 뷰 & 휠 스크롤 지원**: 대시보드에서 접힌 상태의 메모 카드를 대폭 슬림화(38px)하고 접힌 상태에서도 메모 본문 첫 번째 줄이 상단에 노출되도록 최적화했습니다. 추가로, 스크롤바 노출 없이 마우스 휠 스크롤을 감지해 간편하게 오르내릴 수 있도록 편의성을 강화했습니다.
* **버전 뱃지 추가**: 매니저 창 헤더의 로고 우측에 메인 테마와 조화로운 Glassmorphism 스타일의 버전 뱃지(`v1.3.1`)를 부착했습니다.

