Commit Graph

199 Commits (7fe2f0562fa6ad53b7e16131548f00b5c1657463)

Author SHA1 Message Date
RyuJongJin 7fe2f0562f 설정 A: MKV · 자막 분야 (MkvSettings) - 저장 위치 · 이동 버튼 · 인코딩 · AI 자막 · OpenSubtitles 키를 분야로
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 00:11:13 +09:00
RyuJongJin c5aa8c657b 설정 A 분야 13: 화면 · 앱 모양 (DisplaySettings) - 키 13 · clampUiScale → DisplaySettings.clampScale
- ComponentManifest 의 자기 필드 components 는 그대로 (같은 이름이라 잘못 바뀐 것을 되돌림)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 00:06:30 +09:00
RyuJongJin 8d26d1af1e 설정 A 분야 12: 원격 서버 (RemoteSettings) - WebDAV · SFTP · SMB · FTP 목록 · 쉬는 시간 · WebDAV 외부 열기, 키 7
- 비밀 값 처리 (webdavServers 의 plainSecrets · 새 비밀 값은 평문으로 쓰지 않음) 그대로, 설명 주석도 함께 옮김

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:37:49 +09:00
RyuJongJin 828d978812 설정 A 분야 11: 탐색기 도구 (ExplorerToolSettings) - 시스템 폴더 · 루트 · Wi-Fi 공유 · ZIP 수준, 키 6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:32:25 +09:00
RyuJongJin a35293271e 설정 A 분야 10: 암호 보관함 (VaultSettings) - 키 3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:30:18 +09:00
RyuJongJin 056ca186d9 설정 A 분야 9: 실행 · 종료 · 업데이트 (RunSettings) - 키 11 · backgroundRun 함께
- 도구 고침: setter 안의 '      closeAction = v' 줄을 선언으로 잡던 것 (타입은 글자로 시작 · 첫 선언만)
- 문서 주석 [AppSettings.run.x] → [RunSettings.x]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:28:09 +09:00
RyuJongJin 7c6320165a 설정 A 분야 8: 웹 브라우저 (BrowserSettings) - 키 10
- 이미 옮긴 분야 뒤의 같은 이름 (s.tor.homeUrl) 은 바꾸지 않음
- browser_page 의 _CefView 자기 필드 cefWhenElevated 는 그대로 (같은 이름이라 잘못 바뀐 것을 되돌림)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:23:30 +09:00
RyuJongJin 6beeb22e43 설정 A 분야 7: 다운로드 · YouTube (DownloadSettings) - 키 12
- settings_group.dart 에 pickEnum (분야들의 읽기가 같이 씀 - fromJson 의 지역 함수 pick 대신)
- AppSettings.resolvedDownloadRoot 는 download.root 를 씀

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:20:58 +09:00
RyuJongJin 6054daf17a 설정 A 분야 6: 보기 화면 (ReaderSettings) - 키 9 · zipComicV2 표시
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:16:46 +09:00
RyuJongJin 506803ca65 설정 A 분야 5: AI 그림 · 해상도 올리기 (AiImageSettings) - 키 27 · aiServices 의 비밀 값 처리 (plainSecrets) 그대로
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:14:56 +09:00
RyuJongJin 059c8cba59 설정 A 분야 4: 복사 · 이동 · rsync · 실시간 동기화 (CopySettings) - 키 16 · 도우미 _method 함께
- 부르는 곳: s.copyTasks → s.copy.tasks 꼴 (RsyncRun 의 자기 필드 copySkipNewer 는 그대로 - 같은 이름이라 잘못 바뀐 것을 되돌림)
- 문서 주석 [AppSettings.x] → [CopySettings.x] 등

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:10:42 +09:00
RyuJongJin ee7524e1c7 설정 A 분야 3: Tor 브라우저 (TorBrowserSettings) - 키 5 · defaultTorHome → TorBrowserSettings.defaultHome
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:43:02 +09:00
RyuJongJin 1db0bda829 설정 A 분야 2: 네트워크 · DNS (NetworkSettings) - 키 4 · dnsConfig → network.config
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:29:42 +09:00
RyuJongJin 428fe99a82 설정 A 분야 1: 파일 탐색기 (ExplorerSettings) - 키 31 · 옮김 표시 3
- lib/app/settings/explorer_settings.dart: 탐색기 설정의 이름 · 처음 값 · 읽기 · 쓰기를 한 곳에
- AppSettings 는 explorer 분야를 갖고 분야 목록을 돌며 합치기만 (toJson · fromJson 에서 탐색기 키를 지움)
- 부르는 곳: s.explorerLayout → s.explorer.layout 꼴 (옛 이름 getter 없음), 저장 키 이름은 그대로
- 고침: fromJson 이 바뀐 기본값 알림 (_migrated) 을 분야를 읽기 전에 계산하던 것 - 분야를 먼저 읽음
- JSON 약속 시험: 알림 목록 (__migrated) · 옛 판 설정 경우를 더함, 기준은 옛 판 (db45f80) 에서 다시 만듦

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 22:08:55 +09:00
RyuJongJin 0943427cd0 Merge branch 'split_ui' into modular 2026-10-22 20:40:06 +09:00
RyuJongJin 74da2e9a3e 설정 A 바탕: 기록 클래스 · settings_store 옮김 · 분야 틀 (SettingsGroup) · JSON 약속 시험
- lib/app/settings/records.dart: MoveTarget · FolderBookmark · LiveSyncPair · CopyTask
- lib/app/settings/settings_store.dart: SettingsStore · SecretIssue · SettingsLoadProblem (동작 그대로, M0 자리에 TODO)
- lib/app/settings/settings_group.dart: 분야 약속 - 자기 키를 읽고 쓴다
- AppSettings.toJson · fromJson 은 분야 목록 (groups) 을 돌며 합침 (지금은 빈 목록)
- settings.dart 는 옮긴 것을 그대로 내보냄 (부르는 쪽 그대로)
- 약속 시험: test/settings_json_contract_test.dart + fixtures (나누기 전 판의 출력, 합성 값 - 개인 자료 없음).
  사용자 설정 파일은 시험 폴더에 복사해 읽기만 (JJ_USER_SETTINGS_EXPECT 가 있을 때, 기준은 커밋하지 않음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:10:09 +09:00
RyuJongJin afba0dfede 나누기: ai_local (827) 을 받기 저장소 · 엔진 실행 · 작업 모듈로 (→ 482 · 186 · 195)
- ai_local.dart: AiStore · contentRangeStart · sdDevices · pickAiDevice (설정 읽는 줄 그대로)
- ai_local_engine.dart (새): SdDevice · LocalSdEngine · runSdCli · SdRunner · isSdFatalLine · sizeMatches · sdCliLibName · sdExitMessage
- ai_jobs.dart (새): AiJobs
- 부르는 쪽 import 만 고침 (이름 · 동작 그대로), 약속 시험 2개 (실제 cmd.exe 프로세스 · 시험 폴더)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 16:26:12 +09:00
RyuJongJin de4ba076b8 탐색기 시험용 정적 이름 5개를 주입으로 (ExplorerDevice)
- lib/app/explorer_device.dart: ExplorerDevice 약속 (저장 장치 목록 · 드라이브 열림 · Android 경로 · 앱 휴지통 · .nomedia) + RealExplorerDevice (이 기기 그대로)
- ExplorerPage 생성자 인자 device (clock 처럼, 처음 값은 RealExplorerDevice)
- 지움: ExplorerPage.probeDrive · debugVolumes · debugAndroidPaths · debugAndroidTrash · debugNomedia
- 시험: test/support/test_explorer_device.dart (정한 것만 바꿈), harness 가 시험마다 새로 만들어 넘김
- 약속 시험: test/explorer_device_contract_test.dart

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 15:04:38 +09:00
RyuJongJin 067746223b E5c: 압축 보기 · 여는 길 · 목록에서 숨기기 · Rsync 실행을 모듈로 + 점검 통합 시험
관리자 승인 E5 계획 (E5a~E5e). 동작은 바꾸지 않음
- lib/app/archive_browse.dart ArchiveBrowser: 압축을 폴더처럼 (읽기 · 바뀌면 다시 읽고 잊음 알림 · 안의 목록 · 하나 꺼내기),
  archive_ops 를 부르기만, 7-Zip 실행 파일은 부르는 쪽이 줌
- lib/app/file_opener.dart openRouteFor: 열 때 어느 길 (플레이어 · 압축 풀기 · 그림 · PDF · ZIP · HWP · 문서 · 바깥 앱) - 순수
- lib/core/app_hidden.dart HiddenList: 목록에서 숨긴 경로 (대소문자 · 옮기면 따라감 · 실제로 없어진 것만 뺌)
- lib/app/rsync_runner.dart RsyncRun: Rsync 화면 실행 (막는 조건 · 작업 · 옵션 (⇄ 의 ← 는 지우지 않음 · -u) · 미리 보기 ·
  차례로 실행) - sync_preview · sync_tools · rsync_filter · CopyCenter 를 부르기만 (modular_sync 는 rc2 그대로라 겹침 없음,
  15 의 RsyncPlan · RsyncLaunch 가 생기면 그것을 부르게 맞춤)
- lib/ui/explorer/rsync_run_dialog.dart: Rsync 확인 창 위젯 (RsyncRun 만 부름)
- integration_test/explorer_use_check_test.dart: 탐색기 점검 통합 시험 (관리자 승인) - 시험 폴더 이름 · 파일 시각 고정
  (픽셀 비교 기준), 시험 폴더만 씀
- explorer_page 6,267 → 5,922

확인: analyze 0 · 전체 단위 2회 통과 1,329 · 건너뜀 18 · 실패 0 (E5b 에서 고친 explorer_test
"X-plore e: Android 앱 휴지통 - 지우기 = 휴지통으로 · [되돌리기] · [휴지통] 화면에서 되살리기" 도 이 2회 통과) ·
점검 통합 시험 (1920 · 960 · 412) 2회 통과.
캡처 픽셀 비교 (고정 기준 = E5a 를 두 번 찍은 것, 기준끼리 87장 같음): 90장 중 87 · 88장 픽셀까지 같음,
다른 2 · 3장은 기준끼리도 다른 움직이는 장면 (이동 확인 · 선택 끝)
약속 시험 (실제 시험 폴더 · 실제 ZIP · 실제 폴더 비교): test/explorer_modules_e5c_contract_test.dart 5

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 09:51:34 +09:00
RyuJongJin 0300d51092 E5b: 지우기 · 되돌리기 · 복사 계획 · 담기를 모듈로 (explorer_page 는 확인 창 · 알림만)
관리자 승인 E5 계획 (E5a~E5e). 동작은 바꾸지 않음
- lib/app/delete_ops.dart deletePaths · deleteForever · undoTrash · undoRecycle · DeleteReport: 휴지통은 recycle_bin
  (Windows) · app_trash (Android) 를 부르기만. 하나가 실패해도 나머지는 계속, 휴지통으로 못 보낸 것은 몰래 영구 삭제하지
  않고 보고에 (앱 휴지통 밖 · 긴 경로) - 영구 삭제는 부르는 쪽이 물은 뒤
- lib/app/transfer_plan.dart planTransfer · findClashes · namesOf: 복사 · 이동 전 계획 (바깥 것만 · 같은 폴더 135 ·
  막는 문제), 같은 이름 (크기 · 바뀐 날)
- lib/core/file_clipboard.dart FileClipboard: 담기 (빈 것은 담지 않음, 이동은 붙여넣은 뒤 비움, 복사는 남김)
- 다시 쓰는 곳: 탐색기 · 다운로드 화면 지우기 · 보관함 · 정리 · 끌어 놓기 · 붙여넣기 · 찾기 결과 복사
- explorer_page 6,357 → 6,267
- test/explorer_test.dart "X-plore e: Android 앱 휴지통" 시험: [되살리기] 를 화면 넘김이 끝나 눌릴 수 있을 때 누르게
  (넘기는 중에 누르면 다른 화면을 눌러 한 번 실패 - TrashPage 는 바꾸지 않음, 기대값 그대로, 줄 수 그대로 2,009)

확인: analyze 0 · 전체 단위 2회 통과 1,324 · 건너뜀 18 (새 실제 휴지통 시험 1) · 실패 0 ·
실제 Windows 휴지통 시험 (JJ_TEST_REAL_RECYCLE=1: delete_ops · recycle_bin · explorer_conflict 28개) 2회 통과, 흔적 없음 ·
점검 통합 시험 (1920 · 960 · 412) 2회 통과.
캡처 픽셀 비교 (시험 폴더 이름 · 파일 시각 고정, E5a dab9db5 를 두 번 찍은 것이 기준 - 기준끼리 87장 같음): 90장 중
87 · 88장 픽셀까지 같음, 다른 2 · 3장은 기준끼리도 다른 움직이는 장면 (이동 확인 · 선택 끝)
약속 시험 (실제 시험 폴더 · 실제 앱 휴지통 · 열려 있어 못 지우는 실제 파일): delete_ops 3 · transfer_plan + file_clipboard 5

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 09:20:50 +09:00
RyuJongJin dab9db5d4d E5a: 탐색기 창 상태 · 내역 · 줄 목록 · 폴더 읽기 · 저장 장치를 모듈로 (explorer_page 는 부르기만)
사용자 지시 (10/22): 나누기는 곧 모듈화 - 모듈 재사용 · 600줄. 관리자 승인 E5 계획 (E5a~E5e)
- lib/core/nav_history.dart NavHistory: 가 본 폴더 내역 (visit · take → arrive → finish, 상한 50, 움직이는 중 겹침 막기)
- lib/core/explorer/pane_state.dart PaneState: 창 하나의 상태 (화면 부품 없음). 탐색기의 _Pane 은 스크롤 · 필터 칸만 더함
- lib/core/explorer/tree_rows.dart buildTreeRows · TreeRow · passesFilter · quickFilterMatch · globToRegExp:
  펼친 트리 → 줄 목록 (빠른 필터 · 숨김 · 맨 위 장치 · 즐겨찾기 · 압축 안)
- lib/core/explorer/dir_loader.dart loadDir: 폴더 하나 읽기 - file_ops listEntries 를 부르기만, 오류는 이유를 남김
  (빈 목록으로 숨기지 않음), 보던 폴더가 지워지면 갈 상위 폴더를 알림
- lib/app/volumes.dart localVolumes · volumeOf · reachable · reachableAsync · DriveStatus: 저장 장치 · 드라이브 상태
- 모듈마다 첫머리에 약속 (입력 · 출력 · 오류). 다시 쓰는 곳: Rsync 화면 · 보관함 · 찾기 결과 창 (뒤 단계)
- 동작은 바꾸지 않음. explorer_page 6,590 → 6,357

확인: analyze 0 · 전체 단위 2회 통과 1,317 · 건너뜀 17 · 실패 0 · 점검 통합 시험 (1920 · 960 · 412) 2회 통과.
캡처 픽셀 비교 (E4 8335a3e 두 번 찍은 것을 흔들림 기준): 90장 중 84 · 85장 흔들림 안, 벗어난 5 · 6장은 모두 확인 창 -
창 안의 무작위 임시 경로 길이가 달라 창이 몇 px 밀린 것 (눈으로 같음 확인)
약속 시험 (실제 시험 폴더 · 실제 드라이브): nav_history 3 · explorer_rows (pane_state · dir_loader · tree_rows) 5 · volumes 3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 08:27:49 +09:00
RyuJongJin 9ba39e5ed6 E3: 탐색기 처음 값을 선택 규칙대로 - TC 키 (Windows) · 표시는 선택 모드에서만 (V) · 다시 누르면 접기 · Android 한 번 = 선택 · 두 창
기준: wiki "파일 탐색기 선택 규칙 (사용자 지시 모음)" 규칙 1~7, 관리자 결정 3 · (a) (10/22)
- 규칙 1: Windows 는 스타일과 상관없이 Total Commander 키 (F3 보기 · F5 복사 · F6 이동 · F7 새 폴더 · F8 삭제 ·
  Space/Insert 고르기 · Ctrl+R 새로 고침) + Ctrl+C · X · V · A (explorer_keys · _tcKeys)
- 규칙 2: Android 도 한 번 = 선택 · 두 번 = 실행 (explorerClick 처음 값 'select')
- 규칙 3: 펼친 폴더를 다시 누르면 접기 처음 값 켬 (explorerRetapCollapse)
- 규칙 4: 줄 끝 표시는 선택 모드에서만 (explorerAlwaysMarks 처음 값 끔), 모양 V (Icons.check)
- 규칙 7 · 결정 3: 처음 배치 두 창 (폰 세로도), 'auto' 는 설정으로 남김
- 규칙 이전 판에서 저장된 예전 처음 값은 한 번 새 값으로 옮기고 업데이트 뒤 한 번 알림 (explorerRulesV1,
  알림 explorerMarksRule · explorerRetapRule · explorerClickRule · explorerLayoutRule) - 근거: 10/8 사용자 결정
  "예전 기본값을 옮긴 설정은 업데이트 뒤 한 번 알림". 그 뒤 사용자가 고른 값은 그대로
- 결정 (a): Windows 처음 스타일 = TC 와 저장된 'xplore' 묻기 (결정 1) 는 E6 (TC 모양) 과 함께 - 이번에는 넣지 않음
- 번역 9개 추가 · 안 쓰게 된 5개 뺌 (빠진 번역 0)

기대값을 바꾼 시험 (규칙 번호):
- 규칙 7: decisions_test 처음 배치 'dual' / settings_store_test 예전 'dual' 그대로 · 'explorerLayout' 알림 없음
- 규칙 4: explorer_test "두 창: …" 첫 화면에 표시 없음 / "선택 모드: …" V 모양 · 고름 여부 · [선택 끝] 뒤 표시 없음 ·
  설정 '늘 보이기' 를 켜면 보임 / explorer_text_scale_test 3개 (✔ 칸 자리) 는 사용자 설정 explorerAlwaysMarks 를 켜서
- 규칙 3: explorer_test 다시 눌러 접기 (처음 값 켬)
- 규칙 1: explorer_test 빠른 보기 F3 · 새로 고침 Ctrl+R (2곳, Windows 에서 F5 는 복사)
- 새 시험: settings_store_test "E3: 규칙 이전 판 처음 값 옮기기 · 알림 · 다시 고른 값 그대로"

확인: analyze 0, 전체 단위 2회 통과 1,299 · 건너뜀 17 · 실패 0. Selection 지문 그대로 (d438fac0)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 06:09:50 +09:00
RyuJongJin 797126b297 E2: 탐색기 화면은 Selection · ClickPolicy 만 부름 + X-plore 식 폴더 표시 설정 뺌 (결정 5)
- explorer_page: 누르기 (한 번 · 두 번 · 길게 · 오른쪽) 는 ClickPolicy.decide 로만, 표시 (고르기 · 범위 · 뒤집기 ·
  이름 바꾸기 · 지우기 따라가기 · Rsync 폴더 하나) 는 _Pane.sel (Selection) 로만. 화면 안의 규칙 코드 (_normalizeMarks ·
  _toggleMark 의 나누기 · _pick 의 하나만) 를 지움
- Selection 에 rename · removeWhere · has, ClickPolicy 에 사용자 설정 옵션 tapOpens (바로 열기) · retapCollapses
  (다시 누르면 접기) - 처음 값은 E3 에서 규칙대로
- 관리자 결정 5 (10/22): explorerFolderMarkRule ('xplore' 1 · 2 · 3번) 설정 · 설정 화면 항목 · 번역 4개 · 시험 1개를 뺌.
  사용자가 요청하지 않고 넣은 것이라 규칙 6 하나로 합침. 저장된 값은 읽지 않음
- test/explorer_test.dart "선택 모드: 파일 누르기…" 기대값을 바꿈: 하나를 뺀 폴더를 다시 누르면 예전 "전체 다시 고름" →
  관리자 결정 2 (10/22) "그 폴더와 안의 것 전체 취소" (규칙 6). 앱 동작이 결정대로 바뀐 것
- 약속 시험 25개 (지문 selection.dart d438fac0 · 시험 007d2a59) 같은 판 2회 통과
- 전체 단위 1,298 통과 · 건너뜀 17 · 실패 0 (third_party 연결 뒤), 점검 통합 시험 (1920 · 960 · 412) 2회 파일 결과가 1b31609 와 같음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 03:04:53 +09:00
RyuJongJin 6e1e191779 rc2: after_1020 62ba78d (15 - 73fcd97 비밀 열쇠 꼴 규칙 · 62ba78d 화면 · 색 보정 칩 · 자막 편집 F9 · F10 · ftp28) 다시 합침
충돌: lib/ui/subtitle_editor_page.dart - after_1020 의 F9 (좁으면 두 단, 단추 폭) 를 따르고, xplore_p3b 의 JjColors (테마 색) 쪽
const 빼기를 다시 적용 (_hdr 는 final, 분석기 기준 3곳)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:49:58 +09:00
RyuJongJin 73fcd97e90 비밀 열쇠 꼴 규칙: 새 종류는 겹치지 않는 새 머리글로 - 주석 · secretForms 목록 · 시험 (관리자 지시 10/21, 28 검토)
- SettingsStore.secretForms: 이 판이 만드는 비밀 열쇠의 꼴 목록 (os.key · os.user · os.password · dav.servers · dav.pw.<id> · sftp.pw|key|kp.<id> ·
  smb.pw.<id> · ftp.pw.<id> · ai.key.<id>). ownsSecret 은 이 목록으로 (54eb692 와 같은 뜻, 꼴의 . 은 글자 그대로)
- _secretsOf · ownsSecret 옆에 규칙 주석: 새 종류의 비밀 값은 지금 꼴과 앞부분이 겹치지 않는 새 머리글 (dav2. 등) - 겹치면 예전 판이 저장할 때 지움.
  새 꼴은 secretForms 에도 더함
- 시험 settings_store_test: 모든 종류를 채워 저장한 열쇠 11개가 저마다 꼴 하나에만 맞고 꼴마다 쓰임 · sec. 은 설정 꼴이 아님 ·
  dav.token.x · dav.pwx 는 꼴 밖. 관련 7파일 79개 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:13:53 +09:00
RyuJongJin 0f5ed3517e rc2: 보관함 형식 3 - 목록 항목 ↔ 내용 파일 짝 (id · 크기) · 꺼내기 .jjvtmp 기록 (28 지적, 관리자 지시 10/21, 데이터)
- 틈: 내용 파일 (blob) 열쇠를 그 파일 머리의 id 로 만들고 목록 항목에는 id 가 없어, B 의 내용 파일을 A 의 것으로 덮거나 같은 항목의
  예전 내용 파일로 되돌려도 오류 없이 다른 내용을 B 이름으로 꺼냈다
- 고침: 목록 항목에 내용 파일 id (16B, 16진) - 꺼내기 · 메모리로 풀기 (그림 보기) 에서 머리 id 가 목록과 다르거나 (모르면) 풀린 크기가
  목록 크기와 다르면 VaultAuthException, 결과 · .jjvtmp 는 남기지 않음. 머리 (id 포함) 는 이미 조각마다 AAD 라 내용 쪽은 id 에 묶여 있음
- 형식 번호 3: 1 · 2 는 비밀번호 (열쇠) 가 맞은 뒤 목록에 지금 내용 파일의 id 를 채워 다시 쓰고 3 으로 (아직 어느 판에도 나가지 않아 지금 것을 믿음)
- 꺼내기의 "이름.jjvtmp" (받는 폴더의 평문): 쓰기 시작할 때 앱 전용 폴더의 기록 (jj_vault_exporting.txt) 에 적고 끝나면 (성공 · 실패) 지움.
  앱을 켤 때 기록에 남은 .jjvtmp 만 지움 (사용자 폴더를 뒤지지 않음, .jjvtmp 가 아닌 줄은 지우지 않음)
- 시험: 다른 항목 내용 파일로 덮기 · 같은 원본의 다른 내용 파일로 되돌리기 · 목록 크기 다름 → 셋 다 실패 · 남은 파일 0,
  형식 2 → 3 (id 채움 뒤 꺼내기 됨), 꺼내기 기록 (끝나면 지움 · 끊긴 뒤 켤 때 기록의 .jjvtmp 만 지움). vault 22개 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:00:02 +09:00
RyuJongJin a907b3d25e rc2: after_1020 f67e1e3 (15) + xplore_p3b 4ebc4f2 (d3) - 10.20_001 다음 정식 판 후보 (시험판 · 태그 없음, 관리자 지시 10/21)
둘 다 1b31609 (v2026.10.20_001) 바탕. 충돌:
- assets/l10n en · ja · zh-Hans: 열쇠별 3방향 합치기 (양쪽이 같은 열쇠를 다르게 바꾼 것 0)
- lib/ui/home_page.dart 자막 줄: after_1020 의 새 배치 (좁으면 두 줄) 를 따르고, xplore_p3b 의 JjColors (테마 색) 쪽 const 빼기를 다시 적용
- lib/ui/settings_page.dart 설명 글: after_1020 의 테마 글자색 (bodyMedium · onSurfaceVariant - 밝은 화면에서도 맞음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 17:47:59 +09:00
RyuJongJin 9324e4100f WIP X-plore 비교 5-1 ⑦ 밝은 테마 바탕: 색이 테마를 따름 · 설정 "화면 밝기" (시험) (검토 대기)
관리자 지시 10/21 (⑦ (가) 바탕): 처음 값은 어둡게 (예전 색 그대로), 설정 "화면 밝기: 어두운 화면 / 밝은 화면 / 기기 따라" 에 "시험" 표시.
- JjColors 를 두 벌 (JjPalette.dark = 예전 값 그대로 · light) 에서 고르는 값으로. 그래서 JjColors 를 쓰던 const 는 뺐다 (기계적으로, 62개 파일 294곳)
- 밝기를 바꾸면 테마와 함께 화면 조각 전체를 다시 그림 (상태는 그대로) - JjColors 를 직접 읽는 곳도 바로 새 색
- 기기 따라: 기기 밝기가 바뀌면 따라감. 모르는 값 · 없는 값은 어둡게
- 밝은 색은 바탕 · 칸 위 글 · 흐린 글 · 강조 · 경고 · 성공 대비 4.5:1 이상 (시험으로 확인)
- 화면별 맞추기 ((나): 탐색기 → 보기 → 설정 → 나머지) 는 다음 커밋들에서

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 14:08:47 +09:00
RyuJongJin ab735396ac WIP X-plore 비교 5-2 루트 폴더 보기 (su · 읽기 전용) (검토 대기)
관리자 지시 10/21: Shizuku 와 같은 틀 - 처음 끔 · 경고 두 번 (켤 때 · 앱을 켠 뒤 처음 열 때) · 주황 띠 · 고정 명령 셋 · 쓰기 길 없음.
- su 를 Dart 에서 바로 (Kotlin 없음), 경로는 shz://root/… - 시스템 폴더와 같은 읽기 전용 막기 (탐색기 · 클라이언트 둘 다)
- su 가 없거나 거절하면 안내만 (들어가지 않음). 있는지 볼 때는 허락 창을 띄우지 않고, 탭을 누를 때 su 앱의 허락 창
- 처음 여는 곳 "/" (관리자 3a 결정: 다른 앱의 개인 자료가 있는 /data 를 고르기 전에 펼치지 않음), 경고 창에 "다른 앱의 개인 자료도 보일 수 있습니다"
- 셸 경로는 절대 경로만 · 줄바꿈 · \0 거절 · 작은따옴표로 감쌈
- 설정의 켜기 경고 창을 시스템 폴더 · 루트가 같이 씀 (confirmReadOnlyView)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:34:21 +09:00
RyuJongJin 8f6fcdd9ed WIP X-plore 비교 5-2 시스템 폴더 보기 (Shizuku · 읽기 전용) (검토 대기)
관리자 결정 10/21: 1단계는 Shizuku 만 · 읽기 전용 · 처음 끔 · 경고 두 번 (켤 때 · 앱을 켠 뒤 처음 열 때).
- Shizuku API 13.1.5 (MIT - 3a 지시의 "Apache-2.0" 이 아니라 실제 라이선스는 MIT, 고지에 MIT 원문)
- shz://sys/<기기 경로>: 목록 · 정보 · 내용 읽기 (임시로 받아 읽고 지움) 만, 쓰기 · 지우기 · 옮기기 · 새 폴더는 막음
- 셸 명령은 고정된 셋 (목록 · stat · cat), 경로는 절대 경로만 · 따옴표 처리
- 탐색기 탭 [시스템 (읽기 전용)] → Android 폴더, 주황 띠, 꺼짐 · 허락 없음 안내
- 내 판단: Shizuku API 13 의 newProcess 는 숨겨져 있어 반사로 부름 (널리 쓰는 방법, 버전이 바뀌면 다시 확인)
- 내 판단: 시스템 폴더 오류 띠에는 [서버 설정 고치기] 를 두지 않음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:50:23 +09:00
RyuJongJin dc4bae5329 WIP 암호 보관함: 평문이 남을 수 있는 두 곳 (관리자 지시 10/21) - ① 넣기의 [원본 지우기 (이동)]: "원본은 휴지통으로 갑니다 - 휴지통에 평문이 남습니다" 를 보이고 [휴지통으로 (처음 값)] / [영구 삭제] 를 고름, 영구 삭제는 탐색기의 영구 삭제 길 (Shift+Delete 와 같은 확인 창을 한 번 더) ② [보기]: 그림은 메모리에서 바로 (파일로 풀지 않음, ReaderSource 를 MemoryImage 로), 동영상 · 음악만 앱 전용 폴더 (Android getCacheDir · Windows 앱 데이터의 temp) 아래 jj_vault_view_… 에 잠깐 - 닫으면 지움, 자동 잠금 · [잠그기] 때 열린 보기를 닫고 지움, 앱이 강제로 꺼져 남은 것은 다음에 켤 때 지움 (jj_hwp_ 정리처럼), Windows 에서 막 쓴 파일을 다른 프로그램이 잠깐 잡아 지우기가 실패하는 것은 몇 번 더 시도 · 시험: 영구 삭제 고르기 · 그림은 파일 0 · 동영상 보기 뒤 0 · 잠그면 보기 닫힘 · 남은 것 0 · 켤 때 정리 (시험의 보기 폴더는 파일마다 임시로 - flutter_test_config) (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:10:00 +09:00
RyuJongJin 286e6b4698 WIP 암호 보관함 1단계-2 화면 (관리자 결정 10/21): 환경 설정 > 보안 [암호 보관함] (처음 끔) · [보관함 열기] · [보관함 자동 잠금] (처음 1분). 만들기 창에 자리 · "다른 앱도 이 폴더의 암호화된 파일을 볼 수 있음 (내용 · 이름은 안 보임)" · "이 폴더를 지우면 보관함도 사라짐 · 폴더 복사 = 백업" · "잊으면 되살릴 수 없음" + 체크해야 [만들기]. 잠금 풀기는 "보관함을 여는 중… (비밀번호 확인)" (Isolate), 5번 틀리면 30초. 목록 (넣은 날 · 이름 정렬) · [보기] (임시로 풀어 앱 안 보기 화면 · 플레이어, 닫으면 지움) · [꺼내기] (고른 폴더, 같은 이름이면 (2)) · [이름 변경] · [보관함에서 지우기] (확인). 파일 탐색기 길게 누르기 [보관함에 넣기] (보관함을 켰을 때 · 이 기기의 파일만) - 넣기 창의 [원본 지우기 (이동)] 처음 끔, 켜면 다 넣은 뒤 탐색기의 지우기 (확인 · 휴지통). 가운데 버튼 [암호 보관함] (끝에). [마스터로도 열기] (처음 끔, 마스터가 있어야) - 보관함 열쇠 한 벌을 안전 저장소에, 열 때 마스터 확인 (SecretGate), 마스터를 초기화 (clearMaster) 하면 그 한 벌만 지움. 최상 초기화 창에 "보관함은 초기화되지 않음". 자리: Android Download/JJ_MKVMaker/vault · Windows 문서\JJ_MKVMaker\vault. 앱이 뒤로 간 뒤 정한 시간이 지나면 다시 잠금. 보관함 열쇠는 설정 파일 · 버전 보관본에 들어가지 않음 (안전 저장소에만, [마스터로도 열기] 일 때) · 시험 3개 (만들기 → 넣기 / 이동 → 잠금 → 틀린 비밀번호 → 열기 → 꺼내기 → 지우기, 5번 틀림 · 마스터로 열기 · 마스터 초기화, 탐색기 메뉴) (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:45:17 +09:00
RyuJongJin b5434683f4 WIP X-plore 비교 5-1 ⑥ 파일 탐색기 단축키 바꾸기 (관리자 지시 10/21): 환경 설정 > 파일 탐색기 [파일 탐색기 단축키] (키보드가 있는 PC 에서만) - 동작 19개마다 지금 키 · [바꾸기] (다음에 누른 키, Ctrl · Shift · Alt 함께) · [처음 값으로] · [단축키 없음] · [모두 처음 값으로]. 처음 키는 83 의 스타일별 키 그대로 (바꾼 것만 설정 explorerKeyOverrides 에), 바꾼 키는 모든 스타일에 쓰이고 다른 동작과 겹치면 그 동작은 그 키를 잃음 (창에서 먼저 알림), Esc 는 바꿀 수 없음, Rsync 화면은 늘 같은 키 · 시험 (처음 키 = 예전 키 · 바꾸기 · 겹침 · 저장 꼴 · 탐색기에서 바꾼 키 동작 · 설정 화면) (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 03:33:43 +09:00
RyuJongJin f92f801e7a WIP X-plore 비교 5-1 ② 원격 썸네일 (관리자 지시 10/21): WebDAV · SFTP · SMB · FTP 의 그림 (30MB 아래) · 동영상을 X-plore 모양 목록에서 작은 그림으로 - 환경 설정 > 파일 탐색기 "원격 썸네일" (Wi-Fi 에서만 (처음 값) · 늘 · 받지 않음) · 캐시 상한 (처음 200MB, 넘으면 오래 쓰지 않은 것부터) · [캐시 지우기]. 동시에 2개, 화면에서 사라진 줄은 시작하지 않음, 같은 것은 한 번. FFmpeg 가 이 기기 안 스트리밍 다리 (127.0.0.1, Range) 에서 일부만 읽음 - WebDAV 도 Range 로 (모르는 서버는 받으며 건너뜀), 비밀번호는 명령 줄에 넣지 않음. "Wi-Fi 에서만" = Android 의 데이터 요금제 판단 (isActiveNetworkMetered) - 내 판단: VPN 은 그 아래 망을 따름 (집 Wi-Fi 위의 Tailscale 은 받음, 모바일 데이터 위는 받지 않음), PC 는 늘 받음 · 시험 (동시 수 · 보이는 줄 · 상한 · 망 · Range 206/200 · 실제 FFmpeg 썸네일) (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 02:51:45 +09:00
RyuJongJin 81e5906f76 WIP X-plore 비교 5-1 ① 종류별 기본 정렬 (관리자 지시 10/21): 환경 설정 > 파일 탐색기 "종류별 기본 정렬" (처음 끔 - 지금 정렬 그대로). 켜면 파일 중 반 넘게가 사진 · 동영상인 폴더는 날짜 (새것 먼저 - 내 판단: 갤러리처럼), 음악 폴더는 이름, 그 밖은 전체 정렬. 그 폴더에서 정렬을 바꾸면 그 폴더만 기억 (전체 정렬을 바꾸면 눌러도 안 바뀐 것처럼 보이므로) · 켜고 끄면 읽어 둔 목록을 다시 줄 세움 · 시험 (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 02:32:22 +09:00
RyuJongJin 54eb692001 보통 저장은 이 판이 만드는 꼴의 비밀 열쇠만 지운다 - 같은 머리글의 모르는 꼴 (새 판의 dav.token.x 등) 은 남김 (관리자 지시 10/21, 15 알림, 데이터)
- 틈: _writeSecrets 가 머리글 (os. · dav. · ai. · sftp. · smb. · ftp.) 만 보고 지금 설정에 없는 열쇠를 지웠다. 새 판이 같은 머리글로
  새 종류의 열쇠를 쓰면 예전 판으로 되돌려 저장할 때 사용자 비밀번호를 잃을 수 있었다 (40 의 비밀 값 쪽)
- SettingsStore.ownsSecret 을 정확한 꼴로: os.key · os.user · os.password · dav.servers ·
  dav.pw.<id> · sftp.pw|key|kp.<id> · smb.pw.<id> · ftp.pw.<id> · ai.key.<id> ([_secretsOf] 가 만드는 것과 같음).
  지우는 것은 이 꼴 중 그 서버 · 항목이 설정에서 없어지거나 비운 것만
- 초기화의 [저장된 실제 비밀번호 · API 키] (clearForeignSecrets) 는 그대로 sec. 밖을 모두 지움
- 시험 settings_store_test: 모르는 꼴 (dav.token.d1 · sftp.cert.s1 · nfs.pw.n1) 은 보통 저장 · 다시 켜 저장 뒤에도 남음,
  서버 s1 을 지우면 s1 의 pw · key · kp 만 없어지고 s2 · 모르는 꼴 · sec. 은 그대로, clearForeignSecrets 는 3개 지우고 sec. 만 남김.
  관련 9파일 81개 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 01:09:18 +09:00
RyuJongJin 27259af83c 초기화 [앱 설정 전체] 는 이 판이 모르는 설정 키도 지움 · 다른 판의 비밀 값은 [저장된 실제 비밀번호 · API 키] 를 골랐을 때만 (관리자 판단 10/21)
- 까닭 (3a): 사용자가 직접 "전체" 를 골랐고, 새 판으로 돌아갔을 때 예전 값이 되살아나면 더 헷갈린다.
  모르는 키를 남기는 규칙 (40) 은 보통 저장 때만 - resetAllSettings 는 AppSettings()..extra = {} 로 (뜻을 드러냄)
- 안전 저장소: 이 판이 맡지 않는 열쇠 (os. · dav. · ai. · sftp. · smb. · ftp. · sec. 밖 = 다른 판이 쓴 것) 는
  [저장된 실제 비밀번호 · API 키] 를 골랐을 때만 지움 (SettingsStore.clearForeignSecrets, clearStoredSecrets 끝에서). 마스터 · 최상 (sec.) 은 남김
- 초기화 창 설명에 한 줄씩: "다른 판에서 넣은 비밀번호 · 키도 지웁니다." · "다른 판에서 만든 설정도 지웁니다." (en · ja · zh, 새 줄로)
- 시험: master_lock_test - 모르는 키 · 다른 판 열쇠가 있는 설정 → 보통 저장은 남김 → 전체 초기화는 키 없음 · 열쇠는 남음 →
  저장된 비밀번호 지우기는 열쇠도 지움 · sec. 남김. 초기화 창 캡처 다시 (ko · en · ja × 412 · 960, 넘침 없음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 01:00:47 +09:00
RyuJongJin ba968cbed9 WIP X-plore 비교 40 (관리자 지시 10/20): 파일 탐색기 목록 글자 크기 (80~150%, 처음 100%) · 줄 간격 (좁게 0.8 · 보통 · 넓게 1.25, 처음 보통) - 환경 설정 > 파일 탐색기, 세 스타일 모두, 앱 화면 크기 · 기기 글자 크기와 곱함 (처음 값은 예전 줄 높이 그대로) · 버그 고침: 412 폭 "폴더 + 파일 목록" 의 좁은 트리 (77px) 에서 X-plore · TC 줄이 넘치던 것 (100% 에서도) - 아이콘 칸을 남은 폭만큼 · 시험 (세 스타일 × 100/150 넓게/기기 1.3×120 좁게/80) · 캡처 시험 integration_test/explorer_text_shot_test.dart (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 22:45:24 +09:00
RyuJongJin fc0f6316f9 WIP X-plore 맞추기 (관리자 지시 10/20): 숨기기 - [목록에서 숨기기] 전에 무엇이 바뀌는지 확인 창 (목록에서만 빠지고 파일 · 다른 앱은 그대로, 다시 보는 곳) · [다음부터 묻지 않기] (환경 설정 > 파일 탐색기 "목록에서 숨기기 전에 묻기", 처음 켬) · 폴더 길게 누르기 [갤러리 · 음악 앱에서 숨기기 (.nomedia)] / [다시 보이기 (.nomedia 지우기)] (Android, 확인 창 뒤 빈 .nomedia 만 만들고 지움 - 안의 파일 그대로) · 시험 (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:43:51 +09:00
RyuJongJin ed24463192 WIP X-plore 맞추기 (관리자 지시 10/20): 보기 화면 볼륨 키로 넘기기 (아래 = 다음 장, 위 = 이전 장, Android) - 처음 끔 (환경 설정 > 보기), 켰을 때만 보기 화면에서 가로채고 (처리한 키는 시스템 볼륨을 바꾸지 않음) 동영상 · 다른 화면은 그대로 · 시험 (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:29:55 +09:00
RyuJongJin 99de4f4bc9 WIP X-plore 맞추기 (관리자 지시 10/20): 그림 보기 아래 갤러리 줄 - 썸네일 줄, 누르면 그 장으로, 지금 장은 테두리 · 장이 바뀌면 따라감 · 그림 원본 (폴더 · ZIP) 만 · 처음 끔 (위 막대 버튼 · 환경 설정 > 보기에서 켬) · 시험 (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:27:52 +09:00
RyuJongJin ae4e29620e next11: rc_next 44c69af + hwp2 (7bc452e: Android HWP · HWPX 보기 1 · 2단계 · 고침) - 시험판 988
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 20:34:50 +09:00
RyuJongJin 7bc452e54c WIP HWP 고침 (관리자 지시 10/20, 28 검토): ① 앱 시작의 HWP 작업 폴더 정리를 기다리지 않음 (queue_test 가 가짜 시간 안에서 10분 걸리던 회귀) ② 시간 제한은 바꾸기가 실제로 시작된 때부터 · 멈춤은 요청마다 (QueuedHwpDoc 로 줄 세우기 · 시간 · 멈춤을 FFI 에서 떼어 시험할 수 있게), Rust ABI 3: export 에 요청 번호 · jj_rhwp_cancel(번호) · jj_rhwp_cancel_all (시작할 때 깃발을 지우지 않음), 닫으면 줄에 선 것은 시작하지 않음 · check_apk 필요 함수 8개 ③ 진행 창 close 는 그 창이 맨 위일 때만 · 시험: 줄 세우기 3개 · ABI 판 3 (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 20:11:11 +09:00
RyuJongJin 9e40b485a9 rc 회귀 고침: 네트워크 공유 (UNC) 목록 · 기록 파일은 \\ 그대로 · 받는 쪽 UNC 도 \\ · 막히면 모니터링 [▶ 실행] 도 끔 · 표준 입력 (-) 문구 (검토 대기)
관리자 지시 (10/20, 28 이 f43f067 에서 확인 - 지운 것은 없음):
1. 회귀: ed459a0 이 목록 · 기록 · 배치 파일의 \\localhost\C$\… 를 //localhost/C$/… 로 바꿔 넘겨 rsync 가 "failed to open exclude
   file" (exit 11) 로 멈췄다 (985 는 \\ 그대로라 됨). 15 가 앱이 실제로 띄우는 방식 (응답 파일 · MSYS=noglob, rsync 3.5.1) 으로 자리마다
   확인 - 28 의 측정과 같음: 원본 = // 만 됨 (\\ 는 exit 23), 받는 쪽 = \\ 만 됨 (// 는 change_dir 실패 exit 3), 목록 · 기록 파일 =
   \\ 만 됨 (// 는 exit 11 · 기록이 안 생김).
   - rsyncFileOptionArgs: UNC 는 \\ 로 (//서버 로 적은 것도 \\ 로 바꿈), 드라이브는 /cygdrive/… 그대로.
   - 받는 쪽: 새 rsyncDestPath - UNC 면 \\서버\… (rsyncArgs 의 대상 · 실시간 동기화 rsyncArgsFor 의 받는 쪽). 원본은 toCygwinPath (//) 그대로.
     ed459a0 전부터 Windows 네트워크 공유가 받는 쪽인 rsync 는 실패했다 (관리자 판단: 데이터 문제는 아니지만 사용자가 겪는 실패라 rc 에).
2. 모니터링 복사 · rsync 카드: 옵션이 막혀 빨간 안내가 보이면 [▶ 실행] 도 끈다 (확인 창과 같게 - 누르면 실패로 끝났다).
3. --files-from=- · --exclude-from=- (표준 입력) 은 따로 된 문구 "표준 입력 (-) 은 쓸 수 없습니다" · 끝 문구 "목록 파일의 전체 경로를
   적어 주세요" (예전에는 "적어 주세요: - - C:\ …" 로 하이픈이 겹침).
시험: rsync_msys_args_test (실제 rsync - 관리 공유 \\localhost\C$ 로 원본 · 받는 쪽 UNC 와 목록 파일 \\ · // 를 복사 작업으로, 받는 쪽 UNC
실시간 동기화 쌍 · 바꿔 넘기기 단위 · 표준 입력 문구) · monitor_test (막히면 [실행] 꺼짐 · 고치면 켜짐).
전체 시험 1142 통과 · 1 실패 (explorer_test "여러 개 표시 → 삭제 · 새 폴더 · 이름 변경" - 이번 고침과 상관없음, 혼자 두 번 통과 ·
ed459a0 의 전체 시험에서도 통과 - 부하 흔들림) · analyze 문제 없음 · l10n 빠진 번역 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 19:29:47 +09:00
RyuJongJin c43637b9cc WIP HWP 고침 (관리자 지시 10/20, 28 지적): 진행 창 (여는 중 · PDF 로 바꾸는 중) 에 [취소] - ← · [취소] 로 먼저 닫혔으면 끝난 뒤 pop 하지 않음 (예전에는 다른 화면을 닫을 수 있었음, Windows 문서 미리보기도) · 그만두면 결과를 보이지 않고 연 문서를 닫음 · 앱이 켜질 때 남은 HWP 작업 폴더 (jj_hwp_) 정리 · 시험 progress_dialog_test · 정리 시험 (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 18:51:04 +09:00
RyuJongJin ed459a0229 rc: 목록 · 기록 파일의 C:/ · C:\ · UNC 를 rsync 가 여는 꼴로 넘김 · Windows 는 드라이브 경로만 · 막힐 때는 이유 한 줄만 · ---delete 문구 (검토 대기)
관리자 지시 (10/20, 28 이 985 에서 확인):
1. --exclude-from · --include-from · --files-from · --filter / -f 의 ". 파일" · merge · --log-file · --write-batch · --read-batch ·
   --only-write-batch 의 값이 C:/… 이면 앱은 통과시키는데 rsync (MSYS2) 가 "failed to open exclude file" (exit 11) 로 실패했다
   (지운 것은 없음). 관리자 판단: 막지 말고 바르게 넘긴다 - rsyncFileOptionArgs 가 그 값의 C:\ · C:/ · UNC 를 toCygwinPath 로
   (rsyncArgs · 실시간 동기화 rsyncArgsFor). 패턴 · ": 이름" · 받는 쪽 기준 옵션 (--backup-dir 등) · -e 의 값은 그대로.
2. Windows 는 드라이브 (C:\ · C:/) · UNC · /cygdrive/ 만 전체 경로 - 그 밖의 / 는 MSYS 가 자기 설치 폴더 기준으로 읽어 막는다.
   끝 문구: Windows "C:\ 처럼 드라이브로 시작하는 전체 경로로", Android "/ 로 시작하는 전체 경로로".
3. [실행] 이 막힐 때 (알아볼 수 없음 · 상대 경로 등) 는 "미리 볼 수 없습니다" 줄과 [알고 실행합니다] 체크를 숨기고 막히는
   이유 한 줄만 (Rsync 화면 확인 창 · 지우기 포함 실행 확인 창).
4. "원본 파일 지우기 (--remove-source-files)" 가 412 ko · ja 에서 옵션 중간에 갈리던 것: rc 에 든 dfed3fa (keepOptionsTogether)
   로 이미 고쳐짐 - 캡처 shots_rsync_narrow (ko · ja · en 412) 로 확인.
5. "---delete" 의 끝 문구는 "옵션은 - 나 -- 로 시작합니다".
시험: rsync_msys_args_test (실제 rsync - C:/ · C:\ · 다음 낱말 · merge · -f. 로 적은 목록의 keep.txt 를 지킴, --log-file=C:/… 에
기록이 생김 · 바꿔 넘기기 단위 · Windows 의 / 막기 · 끝 문구) · dismiss_test (막힐 때 미리 볼 수 없음 · 체크 숨김) ·
option_paste_test (---delete 문구). 전체 시험 1140개 통과 (17 건너뜀) · analyze 문제 없음 · l10n 빠진 번역 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 18:24:35 +09:00
RyuJongJin bd0801ce66 next9: + msys_args (7160577: Windows rsync 인수를 응답 파일로 · MSYS=noglob - ' 가 인수를 합쳐 거르기가 사라지던 것) - 시험판 985
합침 (d3): unreadableOptions 는 optionProblems 를 거친다 (b1a43c3 의 종류별 안내). 15 의 windows 매개변수 · 큰따옴표 막기를
optionProblems 로 옮기고, 안내는 새 종류 doubleQuote "큰따옴표 (\") 를 빼 주세요" (내 판단).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 16:59:12 +09:00
RyuJongJin 716057734a P0 Windows rsync: 인수를 응답 파일 (@) 로 넘기고 MSYS=noglob - ' 짝짓기 · 글로브 펼치기로 거르기가 사라져 지킬 파일이 지워지던 것 (검토 대기)
관리자 지시 (10/20, 28 재현 - 데이터, 정식 판에도 있음): Windows 의 rsync (MSYS2 런타임, 3.5.1) 는 Windows 프로그램이 넘긴
명령 줄을 스스로 다시 읽는다. 앱의 인수는 맞는데:
- ' 를 따옴표로 짝지어 인수를 합침: -a --delete --exclude="it's.txt" --exclude="Bob's.txt" 가 한 인수가 되어 거르기가 사라지고
  it's.txt · Bob's.txt 가 지워짐 (미리 보기는 "남음"). ' 하나면 rsync 가 실패, ' 가 든 경로 (한쪽 · 양쪽) 는 합쳐져 실패.
- * ? [ ] { } 를 작업 폴더의 파일로 펼침: --exclude *.log 가 작업 폴더의 x.log y.log 로 바뀌어 거르기가 빗나감.
실험 (실제 rsync): MSYS=noglob 은 글로브만 막고 ' 짝짓기는 그대로 (CYGWIN=noglob 은 소용없음). Dart 는 빈칸 · 큰따옴표가 없는
인수를 따옴표로 감싸지 않고, 감쌀 때의 \" 를 MSYS 는 다르게 읽어 명령 줄로는 고칠 수 없음. 응답 파일에 인수마다 큰따옴표로 감싸
넣고 (안의 \ 는 그대로) "@args.txt" 로 넘기면 ' · * ? [ ] { } · 빈칸 · 한글 · \ · @ 가 모두 그대로 감. 응답 파일 경로에 빈칸 · ' 가
있으면 @ 가 먹히지 않아 그 폴더를 작업 폴더로 하고 상대 이름으로 넘김.
- lib/core/rsync_launch.dart: prepareRsyncLaunch (Windows 만 - Android 는 그대로) · 끝나면 지움. 기존 MSYS 값에 noglob 을 더함.
- 띄우는 곳 둘 다: TransferJob (복사 · Rsync 화면 · 모니터링 [실행] · 최종 정리 - robocopy 는 그대로) · LiveSync (실시간 동기화).
  미리 보기는 rsync 를 쓰지 않는다.
- 큰따옴표 (") 가 든 인수는 응답 파일로도 그대로 못 넘김 (Windows 파일 이름에는 없음): 옵션 칸 · 확인 창 · 모니터링에 빨갛게
  (unreadableOptions, Windows 만) · 띄울 때도 막고 이유를 보임.
- 알아 둘 것: rsync 의 작업 폴더가 응답 파일 폴더가 되어, 옵션의 상대 경로 (--exclude-from=목록.txt) 는 그 폴더 기준 (예전에도
  앱의 작업 폴더라 정해지지 않았음 - 절대 경로를 쓰는 것이 맞음).
시험 rsync_msys_args_test (실제 rsync): ' 두 개 · 하나의 --exclude, ' 가 든 원본 경로 · 원본 · 대상 경로 · 경로 + exclude, 따로 쓴 *
· ? · [ ] · { }, [ ] · { } · 빈칸 · 한글 경로, 실시간 동기화 쌍, 응답 파일 지우기, 도우미 · 큰따옴표 막기. 고치기 전에는 7개 실패.
거르기 · 맞추기 · 실시간 · 복사 시험 25개 파일 · rsync_page_test (Windows 통합) 통과.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 16:52:26 +09:00
RyuJongJin b1a43c36c5 WIP 옵션 칸 보충 (관리자 지시 10/20, 28 지적): --cc · --zc · --zl · --zt 등 값 받는 별칭 (오탐) · -–delete 처럼 하이픈과 대시가 섞인 것도 고침 · 안내 끝 문구를 문제 종류에 맞게 (따옴표 닫기 · - 로 시작 · 값 적기 · 곧은 글자로) · 옵션 낱말은 줄바꿈 없이 · 캡처 시험 windows_option_problem_shot_test (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 16:46:57 +09:00
RyuJongJin 484f11d9c2 next9: + remote_idle (7f2263b: 원격 서버가 답하지 않으면 정한 시간 뒤 실패 · File closed 가 이유를 덮던 것) - 시험판 983
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 14:57:25 +09:00