Commit Graph

438 Commits (43c8dab04cc26e60b6e7902fcd5bd18a5f5d42d2)

Author SHA1 Message Date
RyuJongJin 43c8dab04c 보관함 넣기: 넣다가 잠가 멈추면 넣지 못한 원본은 지우지 않음
- 예전부터 있던 버그: [원본 지우기 (이동)] 로 넣는 도중에 잠그면 넣기는 멈추지만, 넣지 못한 원본이 bad 에 들어가지 않아 그 원본까지 지워졌다 (데이터 잃음)
- putVaultAdd: 잠겨 멈출 때 남은 항목의 top 을 bad 에 넣는다 → 넣은 것만 원본을 지우고 나머지는 그대로
- 약속 시험 (실제 시험 폴더 · 실제 보관함): 원본 4개를 넣다가 3번째에서 잠그면 1 · 2 만 지워지고 3 · 4 는 바이트까지 그대로. 고치기 전 코드에서는 4.bin 이 지워져 실패함을 확인

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:07:38 +09:00
RyuJongJin 88aadc7d3e 업데이트 나누기: update_dialog (651) 를 확인 · 고르기 (325) 와 설치 · 되돌리기 모듈 (361) 로
- lib/ui/update_dialog.dart: 새 버전 확인 · [최신 버전 확인] 단추 · 버전 고르기 창 (VersionPickerDialog · UpdateNotes · UpdateBadge)
- lib/ui/update/update_install.dart: 공용 단계 (받기 · 설정 보관 · 진행 창 · gbText · rollbackModelRoots) · installRelease · Android 되돌리기
- 부르는 곳은 그대로 (update_dialog 가 installRelease · gbText · rollbackModelRoots · withProgressDialog 를 내보냄). 동작은 그대로
- 약속 시험 test/update_modules_test.dart

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 17:05:20 +09:00
RyuJongJin e0928ea5a6 보관함 나누기: vault_page (1,095) 를 기능 모듈 3개로 (→ 375)
- lib/ui/vault/vault_session.dart (290): 작은 상태 VaultUiState · 보기 폴더 VaultViewSession · 넣기 (펼치기 · 확인 창 · 넣기)
- lib/ui/vault/vault_actions.dart (335): 파일 일 (보기 · 꺼내기 · 지우기 · 이름 변경 · 깨진 항목) · 폴더 일 · 열쇠 일 (비밀번호 바꾸기 · 마스터로도 열기)
- lib/ui/vault/vault_views.dart (319): 만들기 · 열기 칸 · 목록 · 묻는 창 (이름 · 옮길 곳 · 새 비밀번호)
- 화면은 단계 · 열고 잠그기 (틀린 횟수 · 30초 기다림 포함) 만 맡고 모듈을 부른다. 암호 처리 · 동작은 그대로
- 확인 창은 이미 있는 confirmAction (danger: false) 을 부름
- 약속 시험 test/vault_modules_test.dart (실제 시험 폴더 · 실제 보관함)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 17:05:16 +09:00
RyuJongJin d537d1c3e1 설정 B: settings_page (1,697) 를 분야 섹션 모듈로 (→ 282)
- lib/ui/settings/settings_tiles.dart: 작은 제목 · 글 넣는 줄 · 폴더 줄 · CountSelector
- general_sections (일반 · 화면 · 앱 아이콘) · media_sections (MKV · 자막 · 재생 · 이동 버튼 · 외부 플레이어 · 오른쪽 클릭 메뉴)
- browser_section · files_section (원격 썸네일 캐시 · 읽기 전용 보기 경고) · transfer_sections (Rsync · 다운로드)
- app_sections (실행 · 종료 (단축키) · 저장 공간 정리 · 프로그램 정보)
- 페이지는 틀 · 잠금 · 분야 막대 · 묶음 카드만, CountSelector 는 그대로 내보냄
- 약속 시험: test/settings_sections_contract_test.dart
- 캡처: integration_test/settings_sections_shot_test.dart (ko · en · ja × 412 · 960, 전체) - 나누기 전 판과 픽셀까지 같음 (2회)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 15:56:37 +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 fad723355f E5e: explorer_test (2,009) 를 6개로 나눔 · 공용 준비 explorer_harness · 시험용 이름 지움 · 약속 시험 4개
- test/support/explorer_harness.dart: 시험 폴더 · 셸 · open · act · settle · calm · doubleTap · markOf · chevronOf
- explorer_panes · archive_trash · select_ops · filter_rsync · keys_drag · hidden_find (모두 600 이하)
- 다른 시험 8개는 explorer_test.dart 대신 harness 를 부름
- lib: ExplorerPage.checkPathForTest · debugOpenTrash 지움 (시험은 checkEnteredPath · 실제 [휴지통] 버튼)
- 약속 시험: test/explorer_more_flows_contract_test.dart (explorer_body · search_flow · tools_flow · rsync_flow)
- 시험 이름 1,196 개 나누기 전후 같음, 전체 단위 1,357 (= 1,353 + 4) 2회 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 14:21:38 +09:00
RyuJongJin 79f2a2151f E5d-6: 권한 · 안내 · 보기 창 · 찾기 · 이름 · 도구 · 끌어 놓기 · 키 · 배치를 모듈로 (explorer_page 2,032 → 474)
- explorer/access_flow.dart: ExplorerAccess (모든 파일 권한 · 시스템 폴더 · 루트 · 다시 연결)
- explorer/pane_notices.dart: ExplorerNotices (목록 위 안내: 읽기 전용 · 권한 · 읽지 못함 · 서버 키 · 만들다 만 파일)
- explorer/view_dialogs.dart: 정렬 · 즐겨찾기 · 내역 · 창 배치 · 버튼 구성
- explorer/search_flow.dart · rename_flow.dart · tools_flow.dart (저장 공간 · Wi-Fi) · drop_flow.dart
- explorer/key_flow.dart: ExplorerInput (단축키 · 글자로 빠른 필터 · 마우스 앞뒤)
- explorer/explorer_layout.dart · explorer_body.dart · explorer_bars.dart: 배치 규칙 · 창 배치 · 위 막대들
- explorer/explorer_flows.dart: 흐름 모듈 묶음 (버튼 · 메뉴 · 키 · 끌어 놓기가 같이 씀)
- 빠른 보기 · MKV 목록 넣기는 open_flow, 창 틀은 pane_view (ExplorerPaneFrame)
- ExplorerCommands 16 → 3 (context · otherDir · dual)
- 약속 시험: test/explorer_page_modules_contract_test.dart
- 동작은 그대로 (전체 단위 2회 · 점검 통합 2회 · 픽셀 비교)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 13:48:49 +09:00
RyuJongJin 4b3ccb0c4f E5d-5: 줄 메뉴 · 지우기 · 옮기기 · rsync · 파일 열기 흐름을 모듈로 (explorer_page 3,531 → 2,032)
- explorer/write_guard.dart: ExplorerGuard (압축 안 · 시스템 폴더 · 루트는 읽기 전용, 압축에서 꺼내기)
- explorer/explorer_jobs.dart: ExplorerJobs (도는 복사 · 이동 · rsync 목록, 끝나면 잠깐 뒤 내림, 이어받기)
- explorer/transfer_flow.dart: ExplorerTransfers (복사 · 이동 · 담기 · 붙여넣기 · 확인 창 · rsync 실행 파일)
- explorer/rsync_flow.dart: ExplorerRsyncFlow (Rsync 화면 → ← ⇄)
- explorer/delete_flow.dart: ExplorerDeleteFlow (휴지통 · 앱 휴지통 · 영구 삭제 · 되돌리기 · 휴지통 열기)
- explorer/open_flow.dart: ExplorerOpener (file_opener 의 길대로 실제로 열기 · 보기 · 재생 · 압축 · PDF · 공유)
- explorer/item_menu.dart · item_actions.dart: ExplorerItemMenu · 정보 · 경로 복사 · 숨기기 확인 · .nomedia · 아이콘 줄
- explorer/name_dialog.dart: askName
- ExplorerSelect.targets 더함, ExplorerCommands 24 → 16
- 약속 시험: test/explorer_flows_contract_test.dart (버튼 약속 시험은 실제 흐름으로)
- 동작은 그대로 (전체 단위 2회 · 점검 통합 2회 · 픽셀 비교)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 13:07:19 +09:00
RyuJongJin 77d962bcdf E5d-4: 기능 버튼 · 버튼 줄 · 표시 막대 · 진행 패널을 모듈로 (explorer_page 4,229 → 3,532)
- explorer/explorer_buttons.dart: ExplorerButton (옮김) · ExplorerCommands 약속 · ExplorerButtons (누르기 · 길게 = 짝 동작)
- explorer/toolbar.dart: ExplorerToolbar (버튼 줄 · 더 보기 · 고정)
- explorer/marks_bar.dart: ExplorerMarksBar · markPattern · PatternDialog
- explorer/transfer_panel.dart: ExplorerTransferPanel · TransferProgressChip / explorer/job_view.dart: TransferJobView
- ExplorerSelect.clearMarks 더함 (표시 지우기)
- 화면의 일은 이름을 공개로 바꿔 ExplorerCommands 를 바로 채움 (전달 코드 없음)
- 약속 시험: test/explorer_buttons_contract_test.dart
- 동작은 그대로 (전체 단위 2회 · 점검 통합 2회 · 픽셀 비교)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 12:29:35 +09:00
RyuJongJin b5b1b13d61 E5d-3: 창 머리 · 창 보기 · 경로 입력 · 서버 흐름을 모듈로 (explorer_page 4,857 → 4,227)
- explorer/pane_header.dart: ExplorerPaneHeader (뒤로 · 앞으로 · 즐겨찾기 · 필터 · 저장 장치 탭 · 끝 버튼 / 좁으면 ⋮)
- explorer/pane_view.dart: ExplorerPaneParts 약속 · ExplorerPaneView · ExplorerListView · ExplorerFilterBar · ExplorerExtraRow · 열 배치 · 줄 키 · 안내 높이
- explorer/path_dialog.dart: PathDialog · checkEnteredPath · SMB 주소 도우미
- explorer/server_flows.dart: ExplorerServers (WebDAV · SFTP · FTP · SMB 추가 · 고치기 · 경로 입력)
- 약속 시험: test/explorer_pane_view_contract_test.dart
- 동작은 그대로 (전체 단위 2회 · 점검 통합 2회 · 픽셀 비교)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 11:57:37 +09:00
RyuJongJin e6e4499f22 E5d-2: 줄 위젯 · 누르기/고르기 작은 컨트롤러 · 썸네일을 따로 (explorer_page 는 부르기만)
관리자 승인 E5d 6단계 중 2. 동작은 바꾸지 않음 (ExplorerController 에는 더하지 않음 - 관리자 지시)
- lib/ui/explorer/explorer_select.dart ExplorerSelect (242줄): 줄 누르기 · 두 번 · ✔ · Rsync 고르기 · Shift 범위 · Ctrl 고르기 ·
  펼치기/접기 · 선택 모드. 규칙은 ClickPolicy · Selection 이 가지고 여기는 화면 상태에 이어 주기만. 파일 여는 일은 부르는 쪽 콜백
- lib/ui/explorer/row_view.dart ExplorerRowView (323줄): 줄 하나 그리기 - 컨트롤러 둘 + 콜백 (메뉴 · 끌기 · 놓기) 만 받음
- lib/ui/explorer/file_thumbs.dart (174줄): 동영상 정보 · 썸네일 · 큰 썸네일 (빠른 보기도 씀)
- 줄 위젯으로 옮기며 생긴 회귀 하나를 고침: 좁은 폴더 트리의 이름 두 줄 판단에서 목록 글자 배율을 두 번 곱함 (줄 위젯은 이미
  배율을 곱한 MediaQuery 안) → 150% Total Commander 에서 2px 넘침 (explorer_text_scale_test 40). 배율을 다시 곱하지 않게 해
  원래 계산과 같게. E5d-1 판에서 그 시험이 2회 통과함을 확인한 뒤 고침
- explorer_page 5,497 → 4,857

확인: analyze 0 · 전체 단위 2회 통과 1,335 · 건너뜀 18 · 실패 0 · 점검 통합 시험 (1920 · 960 · 412) 2회 통과.
캡처 픽셀 비교 (고정 기준 E5a): 90장 중 88 · 89장 픽셀까지 같음, 다른 1 · 2장은 기준끼리도 다른 움직이는 장면 (이동 확인)
약속 시험 test/explorer_select_contract_test.dart 3 (실제 시험 폴더 · Host 는 실제 화면 · 시각 주입)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 11:14:31 +09:00
RyuJongJin 4279747371 E5d-1: 탐색기 상태 · 화면 밖의 일을 ExplorerController 로, 화면 부탁은 ExplorerHost 로
관리자 승인 E5d 6단계 중 1. 동작은 바꾸지 않음
- lib/ui/explorer/explorer_controller.dart ExplorerController (448줄): 창 두 개 · 지금 창 · 저장 장치 · 드라이브 · 폴더 크기 ·
  압축 · 목록에서 숨기기 · 읽기 · 정렬 · 이동 · 뒤로/앞으로 · 기억 · 새로 고침. 일은 이미 있는 모듈 (PaneState · NavHistory ·
  dir_loader · tree_rows · volumes · archive_browse · app_hidden · folder_size) 에 맡기고 묶어 부르기만
- lib/ui/explorer/explorer_host.dart ExplorerHost: 일이 화면에 부탁하는 것 (떠 있는지 · 알림 · 스크롤 · 다음 그리기).
  탐색기 화면 상태가 구현
- lib/ui/explorer/explorer_pane.dart ExplorerPane: PaneState + 화면 부품 (스크롤 · 빠른 필터 칸) - explorer_page 의 _Pane
- explorer_page 는 컨트롤러를 부르기만: 5,922 → 5,497. 줄 누르기 · 고르기는 E5d-2 (줄 위젯과 함께)

확인: analyze 0 · 전체 단위 2회 통과 1,332 · 건너뜀 18 · 실패 0 · 점검 통합 시험 (1920 · 960 · 412) 2회 통과.
캡처 픽셀 비교 (고정 기준 E5a): 두 회 모두 90장 중 88장 픽셀까지 같음, 다른 2장은 기준끼리도 다른 움직이는 장면 (이동 확인)
약속 시험 test/explorer_controller_contract_test.dart 3 (실제 시험 폴더 · Host 는 실제 화면 - 실제 ScaffoldMessenger 알림 ·
실제 다음 그리기). 탐색기 화면 자신이 Host 로 하는 일은 explorer_test 의 화면 시험이 실제로 확인

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 10:26:22 +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 8335a3eac7 E4: 탐색기 불편 고침 - 공용 알림 showNotice (13곳) · 공용 확인 창 confirmDialog · 두 창 처음 폴더 · 다른 창 표시 안내 · 지금 줄 강조 · 폰 두 창 넘침
점검 (wiki 파일 탐색기 사용 점검 10-22) U1 · U2 · U4 · U5 · U7 · U8, 관리자 승인 10/22
- U2: lib/ui/notice.dart showNotice - 단추가 있는 알림은 앱 전체 한 값 noticeDuration (10초) 뒤 저절로 닫힘, 모두 ✕.
  단추 있는 SnackBar 13곳을 모두 옮김. 사용자가 닫을 때까지 두는 것은 248 DNS · 198 감지한 언어, 부르는 쪽이 닫는 것은
  AI 시작 전 [취소] · 다운로드 준비 (untilClosed)
- U7: lib/ui/confirm_dialog.dart confirmDialog - [확인] 만 true · Enter = 첫 초점, 되돌릴 수 없는 일 (영구 삭제 · 늘 덮어쓰기)
  은 첫 초점 [취소] (관리자 결정). 탐색기 지우기 · 영구 삭제 2곳 · 복사 · 이동 · 같은 폴더를 옮김 (나머지는 W)
- U4: 복사 · 이동 · 지우기 확인 창에 "다른 창에 N개 표시됨 (이번 대상 아님)" - 다른 창 표시는 그대로 (관리자 결정)
- U1: 저장된 경로가 없을 때만 오른쪽 창은 두 번째 저장 장치
- U5: 지금 줄은 진한 바탕 + 왼쪽 강조 막대
- U8: rc2 e785ba9 (TailText) 로 이미 됨 - 412 캡처로 확인
- 폰 세로 두 창 (E3 규칙 7) 넘침 2곳: 아래 표시 줄은 공용 lib/ui/adaptive_row.dart AdaptiveRow (좁으면 두 줄),
  진행 패널 이름 칸은 min(300, 폭 45%). 넓은 화면은 그대로
- explorer_page 는 시각을 생성자로 받음 (clock, 처음 값 DateTime.now) - 폴더 두 번 누르기 판단을 시험이 정한 시각으로
- 600줄 규칙: NameClash · clashCompareText · fileDateText 를 lib/core/name_clash.dart 로 (explorer_page 6,605 → 6,590),
  시험 도우미 testNow · refreshKey 를 test/support/explorer_clock_keys.dart 로 (explorer_test 2,011 → 2,009)

기대값을 바꾼 시험 (근거):
- browser_test 실행 취소 알림 5초 → noticeDuration: 5초는 정해진 값이 아님. 10/5 967b729 (HANDOFF 12) 가 정한 것은
  "버튼 달린 알림은 저절로 사라짐" 이고 앱은 시간을 정하지 않아 Flutter 기본 4초였다. 성질은 지키고 시간은 관리자가
  승인한 앱 전체 한 값 (U2)
- explorer_test "두 창: …" 다시 눌러도 접지 않음 (189) → 다시 누르면 접힘: 선택 규칙 노트 규칙 3 "폴더 한 번 누르기 =
  펼치기 · 접기" (노트 머리: 관리자 판단과 다르면 이 노트를 따름) · E3 승인. E3 에서는 두 번째 누르기가 600ms 안에
  들어와 우연히 통과했었음 → 시각 주입 (testNow) 으로 고침

확인: analyze 0 · 전체 단위 2회 통과 1,306 · 건너뜀 17 (E4 실패 0) · 점검 통합 시험 (1920 · 960 · 412) 2회 통과,
넘침 0, 두 회 파일 결과 같음. 약속 시험 notice 4 · confirm 3 (지문 notice.dart 29b3c951 · confirm_dialog.dart ff964f5f)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 07:53:09 +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 88790819be E1: 탐색기 누르기 · 고르기 모듈 Selection · ClickPolicy (lib/core/selection.dart) + 약속 시험 한 장
- 기준: wiki "10 wiki/규칙/파일 탐색기 선택 규칙 (사용자 지시 모음)" 규칙 2~6 · 8
- ClickPolicy.decide: 누르기 (한 번 · 두 번 · 길게 · 오른쪽) · 종류 · 선택 모드 · 펼침 · 목록 · 다시 → 할 일 하나
- Selection: 파일 고름/취소 · 폴더 = 자기 + 안 전체 · 안의 하나만 빼기 · Rsync 폴더 하나
- 관리자 결정 2 (10/22): 하나를 뺀 폴더를 다시 누르면 그 폴더와 안의 것 전체 취소
- 목록을 읽지 못하면 표시를 바꾸지 않고 던짐 (반쯤 바뀐 상태 없음)
- 약속 시험 test/selection_contract_test.dart 23개 (규칙 표 16 + 실제 폴더 7), analyze 0 뒤 같은 판 2회 통과
- 지문 (git blob): selection.dart feb2d80a · 시험 ceb4e16e
- 화면은 아직 이 모듈을 부르지 않음 (E2)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 02:28:21 +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 e785ba96a6 rc2: 경로 줄은 좁으면 앞을 "…" 로 - 지금 폴더가 늘 보이게 (보관함 · 탐색기 위 경로 막대) · 보관함 정렬 상자는 다른 줄로 (28 지적, 관리자 지시 10/21)
- 보관함 깊은 폴더 (360 · 글자 1.3) 에서 "보관함 › 가족 › 2026 › 여름 휴가…" 로 끝이 잘려 지금 폴더가 안 보였고 정렬 상자와 붙어 두 줄로 눌렸다
- TailText (lib/ui/tail_text.dart): 들어가면 그대로, 모자라면 구분 ( › · \ · / ) 에서 앞을 잘라 "… › 여름 휴가 › 제주도 둘째 날",
  마지막 조각도 길면 그 끝을 글자 단위로. 지금 글꼴 · 글자 배율로 잼
- 보관함: 폴더 안에서는 경로 줄 (TailText) 과 정렬 상자를 다른 줄로. 맨 위 (안내 글 + 정렬) 는 예전 그대로
- 파일 탐색기 위 경로 막대도 같은 문제 (끝이 "…" 로 잘림) 라 TailText 로 - 다 들어가는 경로는 예전 그대로
- 시험 tail_text_test (자르는 자리 · 1.3 배 좁은 칸에서 지금 폴더가 보임), vault_page · explorer 시험 그대로 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:48:25 +09:00
RyuJongJin c65f4851f7 rc2: 탐색기 Windows · TC 날짜 열이 "2026-10-2…" 로 잘리던 것 - 모자라면 짧은 꼴, 그래도 모자라면 숨김 (28 지적, 관리자 지시 10/21)
- 날짜 열 폭 (열 비율 · 창 폭) 과 날짜 글 폭 (줄의 흐린 글 모양 · 지금 글꼴 · 기기 × 목록 글자 배율, TextPainter) 을 견줘:
  다 들어가면 "2026-10-21 14:05" (예전 그대로) → 아니면 짧은 꼴 (올해 "10-21 14:05" · 아니면 "2025-10-21") → 아니면 유형을 먼저 숨기고 (아직이면)
  다시 봄 → 그래도 모자라면 날짜 숨김. 열 머리 · 줄이 같은 결정을 씀 (두 창 · 폴더 + 파일 목록 모두)
- 일본어는 / ("2026/10/21 14:05" · "10/21 14:05"), 한국어 · 중국어 · 영어는 예전 꼴 그대로
- 함께 찾은 것: 300 폭 · 글자 1.3 × 150% 에서 위 막대 제목 ("파일 탐색기") 이 넘쳐 그리기 오류 → 경로 막대에 80 남짓 남을 때까지는
  제목 폭 그대로, 그보다 좁으면 제목을 "…" 로 (보통 화면은 바뀌지 않음)
- 시험 integration_test/windows_datecol_shot_test.dart: 실제 글꼴로 312 조합 (폭 13 × 스타일 2 × 언어 ko · ja · zh × 글자 배율 4) -
  날짜 칸 잘림 0 (RenderParagraph.didExceedMaxLines), 넓은 창은 다 쓴 꼴, 짧은 꼴 칸 162 · 날짜 숨김 84 조합, 360 · 412 는 PNG.
  목록이 빈 채로 남는 일이 가끔 있어 (빙글이 없이, 3번 중 2번 실행에서 1~2 조합) 그림을 남기고 [새로 고침] 뒤 확인 - 따로 알림

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:39:14 +09:00
RyuJongJin 62ba78dfeb 화면 · 색 보정 칩 ✓ 만 · 자막 편집 제목 / 파일 이름 두 줄 · F9 자막 표 좁으면 두 단 · F10 미리보기 글 위로 · ftp28 처음 연결만 한 번 다시 (관리자 지시 10/21, 28 · 15 찾음)
- 화면 · 색 보정 창 (28): 고른 비율 칩 ("세로 9:16" 등) 은 그림이 있는 칩이라 기본 체크가 그림 위에 겹쳤다 → 고르면 그림 자리에 ✓ 만
  (showCheckmark: false). 맞추기 · 회전 칩은 원래 ✓ 만
- 자막 편집 화면 (28): 960 에서도 "자막 편집 · …" 로 잘려 파일 이름이 안 보였다 → 제목은 "자막 편집", 파일 이름은 그 아래 한 줄
  (path_label.middleEllipsis 로 가운데를 줄여 끝 .srt 가 보임, Tooltip 으로 길게 누르면 · 마우스를 올리면 전체). 열쇠 '자막 편집 · {0}' → '자막 편집'
- F9: 자막 편집 표의 칸 폭 (# 48 · 시작 130 · 끝 130 · 단추 96) 이 412 에서 넘쳤다 (24 · 27px) → 내용 칸까지 한 줄에 들지 않으면 두 단
  (위: # · 시작 · 끝 · 단추, 아래: 내용). 시간 칸은 줄이지 않고, 두 단일 때 # 칸 28 · 단추 누를 자리 40 으로 위 단이 412 에 듬. 넓으면 그대로
- F10: 화면 · 색 보정 미리보기의 파일 이름 · 시각 글이 412 에서 [누르고 있으면 조정 전] 위에 겹쳤다 → 좁을 때 (< 560) 만 미리보기 위쪽으로
  (한 줄 · 줄임, 돌아가는 표시 자리는 비움). 단추 자리는 그대로
- ftp28 (28 원문: 부하 중 시험 서버가 처음 연결에 16초 답하지 않음): 시험 도우미가 처음 연결 (서버 준비) 이 "닿지 않음" 일 때만 2초 뒤
  한 번 다시 시도, 맞추기 도중 실패 · 비교 차이는 다시 시도하지 않음. 다시 시도했으면 jj_ftp28_fail 기록에 "다시 시도함" (통과해도)
- 캡처 windows_ui2_shot_test (ko · ja × 412 · 960): 칩 ✓ 만 · 제목 "자막 편집" · 파일 이름 끝 .srt · 넘침 없음 - 4개 통과, 직접 봄.
  ftp_test · ui_test 15개 통과, l10n 빠진 것 0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:38:39 +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 d4266a7236 rc2: 시스템 폴더 · 루트 (shz://) 가 원본이나 받는 곳인 이동은 시작 전에 막음 (28 지적, 관리자 지시 10/21)
- 예전: 복사는 되고 원본 지우기에서 오류로 끝났다 (손실 없음)
- 지금: "읽기 전용이라 옮길 수 없습니다 - 복사를 쓰세요" 를 알리고 시작하지 않음. 이동 버튼 (_transfer) · 이동으로 담기 (_toClipboard) ·
  붙여넣기 · 끌어 놓기 · 메뉴가 모두 지나는 _runTransfer 에서 원본 · 받는 곳 둘 다 봄
- 시험: shizuku_test 의 탐색기 시험에 [이동] → 안내 · 담지 않음 · 복사 안 함. shizuku · root 11개 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:09:40 +09:00
RyuJongJin 06a6b1e8aa rc2: 보관함에 넣은 파일의 썸네일 캐시 지우기 · 내용 파일이 빠진 항목 안내 · [목록에서 빼기] (28 지적, 관리자 지시 10/21)
- 썸네일 캐시: 넣을 때마다 그 원본 (경로 · 크기 · 바뀐 때) 의 캐시를 지움 - 탐색기 동영상 썸네일 (jj_thumbs) · 빠른 보기 큰 것 (|640) ·
  원격 썸네일 (jj_rthumbs), 이름은 같은 키의 md5 (lib/core/thumb_cache.dart). 메모리 기억 (탐색기 · 원격) 도 그 경로만 잊고,
  다 넣은 뒤 화면 그림 기억 (Flutter imageCache) 도 비움. [원본 지우기 (이동)] 은 같은 파일이라 넣을 때 이미 지워짐
- 내용 파일이 없거나 (예전 목록으로 되돌림 등 - 전에는 PathNotFoundException) 짝이 맞지 않으면: "보관함 파일이 바뀌었거나 빠졌습니다 -
  이 항목은 꺼낼 수 없습니다 (보관함 폴더를 다른 곳에서 바꿨는지 확인하세요)", 원문은 [자세히], [목록에서 빼기] (확인 창 - 남은 내용 파일도 지움).
  꺼내기 · 보기 (그림 · 동영상) 모두. 받는 쪽 폴더 오류 등 그 밖은 예전처럼 알림
- 시험: thumb_cache_test (그 파일 것만 3개 지움 · 다른 파일 것 그대로 · 원격 키 꼴이 같음 · 메모리 잊음),
  vault_page_test (내용 파일 지운 항목 → 안내 · [자세히] · 남은 파일 없음 · [목록에서 빼기] 로 비움). 관련 35개 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:07:33 +09:00
RyuJongJin aa67171a5e rc2: 원격 썸네일 - Range 를 모르는 서버의 동영상은 받지 않음 · 썸네일 하나에 받는 양 상한 (28 지적, 관리자 지시 10/21)
- 틈: WebDAV 서버가 Range 를 모르면 (200) 처음부터 받으며 건너뛰어, 큰 동영상의 뒤쪽 한 장면 썸네일에 파일 전체를 받을 수 있었다
- WebDAV: 동영상 썸네일 전에 한 바이트 (bytes=0-0) 를 물어 206 이 아니면 만들지 않고 기본 아이콘 (몸은 받지 않고 끊음).
  서버마다 이번 실행 동안 기억 (앱을 다시 켜면 한 번 다시 봄), 물어보다 실패하면 기억하지 않음
- 시스템 폴더 · 루트 (shz://): 읽기가 늘 파일 전체 복사라 동영상 썸네일을 만들지 않음 (d3 판단). SFTP · SMB · FTP 는 그 자리부터 읽어 그대로
- 스트리밍 다리에 썸네일 주소마다 보낼 양의 상한 (동영상 8MB · 그림 30MB) - 넘으면 끊음. 플레이어 주소는 상한 없음 (그대로)
- 그림은 지금처럼 30MB 아래만
- 시험: 200 서버 동영상 → FFmpeg 를 부르지 않음 · 한 번만 물음 (같은 서버 다시 안 물음), 206 서버 → 지금처럼 다리로, shz:// 동영상 안 함, 상한 (100 바이트 상한 → 100 에서 끊고 다시 와도 0, 플레이어 주소는 1000 그대로)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:03:12 +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 74e5e54be9 rc2: mkvdetail · bigtext 캡처도 JJ_SHOT_THEME · after_1020 의 반투명 주의 색 3곳도 테마 색 (warning · alert) (관리자 지시 10/21)
- 어두운 화면 값은 같음 - 두 캡처 묶음 78장을 바꾸기 전 · 뒤로 찍고 한 번 더 찍은 흔들림 기준 밖 차이 0
- 밝은 화면 캡처 (mkvdetail 18 · bigtext 60) 를 직접 봄: 읽기 어려운 곳 없음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 18:55:38 +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 0a9a2d0af5 WIP ⑦ 밝은 화면 (나) 2: 보기 · 재생 · 나머지 화면 · 캡처 시험 넓힘 (검토 대기)
관리자 지시 10/21 (⑦ (나) 둘째 이후):
- 보기 화면 · 재생 막대는 밝은 화면에서도 어두운 띠 (그림 · 동영상 위 - 사진 보기 앱처럼, 내 판단).
  그 띠 위 강조 (켜진 단추 · 쪽 슬라이더 · 썸네일 테두리 · 재생 위치) 는 어두운 화면의 청록, 검은 바탕의 흐린 글자도 어두운 값
- 시간줄: 재생 위치 선 · 고른 칸 글자 (밝은 화면), AI 보라 (aiColor) 는 밝은 화면에서 진하게,
  다운로드 진행 막대 글자는 밝은 화면에서 진한 글자 + 흰 테두리
- 캡처 시험: 보기 화면 캡처 (windows_reader_shot_test) 를 새로 · 662 · i18n (앱 전체는 설정 화면 밝기) · check · magnet 에도 JJ_SHOT_THEME
- 시험 흔들림: 보관함 2단계 시험 정리 때 폴더를 잠깐 잡고 있으면 (errno 32) 몇 번 더 지움
- 확인: 어두운 화면 캡처를 808300b 와 픽셀로 견줘 (같은 커밋 두 번 찍은 흔들림 밖) 차이 0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 17:15:21 +09:00
RyuJongJin 808300b69e WIP ⑦ 밝은 화면 (나) 1: 파일 탐색기 · 주의 색 · 캡처 시험 밝은 화면 (검토 대기)
관리자 지시 10/21 (⑦ (나) 화면마다 차례로 - 첫째 파일 탐색기):
- 주황 · 빨강 · 노랑 · 초록 (orangeAccent · redAccent · amber · greenAccent) 을 테마 색 warning · alert · amber · positive 로.
  어두운 화면은 예전 Material 값 그대로, 밝은 화면만 진하게 (글자 4.5:1 · 노랑 아이콘 3:1, 노랑 글자는 amberText)
- 탐색기: 흰 바탕에서 옅은 회색 파일 아이콘을 밝은 화면일 때만 진하게, 저장 공간 그림 "이 폴더의 파일" 칸 글자 (밝은 화면)
- 통합 캡처 시험에 JJ_SHOT_THEME=light (어두운 것과 견줌)
- 설정 설명 글을 새 이름 (밝은 화면 · 기기 따라) 에 맞춤
- 확인: 어두운 화면 캡처 95장을 9324e41 과 픽셀로 견줘 실행마다 바뀌는 곳 (시각 · CPU 숫자 · 임시 이름) 밖의 차이 0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 15:59:16 +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 5a5ecacb31 WIP 보관함 형식 번호 2 (2단계 폴더) - 1단계 보관함은 열 때 번호만 올림 (검토 대기)
관리자 3a 지시 (10/21): 1단계 형식만 아는 판이 2단계 보관함을 열면 '새 판으로' 를 알리게. 열쇠가 맞은 뒤에만 vault.json 의 format 만 바꾼다 (솔트 · 감싼 열쇠는 그대로).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:20:31 +09:00
RyuJongJin 8fa270a62e WIP X-plore 비교 5-2 보관함 2단계: 폴더째 넣기 · 원격 파일 · 보관함 안 폴더 (검토 대기)
관리자 지시 10/21 (보관함 2단계):
- 폴더째 넣기: 안의 구조 · 빈 폴더 그대로, 폴더 이름도 암호화한 목록에만 (바깥 보관함 폴더에는 무작위 이름 파일뿐)
- 원격 (WebDAV · SFTP · SMB · FTP · 시스템 폴더) 파일: 앱 전용 폴더 (jj_vault_view_in_…) 에 받아 넣고 받은 것은 바로 지움
- 보관함 안 새 폴더 · 파일 · 폴더 옮기기 · 폴더 이름 바꾸기 · 폴더째 꺼내기 · 폴더째 지우기 (확인 창에 파일 수), ← 는 위 폴더로
- [원본 지우기 (이동)] 는 다 들어간 것만 (폴더는 안의 것이 모두 들어갔을 때만, 읽지 못한 폴더는 반만 넣지 않음)
- 보관함 비밀번호 바꾸기는 1단계에 있음 (열쇠만 다시 감쌈)
- 버그 수정: 이름 묻는 창이 닫히는 중에 글자 칸을 버려 오류 → 창과 함께 버림
- 내 판단: 폴더 정보는 1단계 판과 맞게 - 맨 위 파일은 목록 모양 그대로, 빈 폴더 목록은 따로 (folders.jjd, 1단계의 정리가 지우지 않음).
  1단계 판으로 되돌려 쓰면 파일은 다 보이지만 폴더 구조는 그 판이 목록을 다시 쓸 때 풀린다 (내용은 잃지 않음)
- 내 판단: 넣는 폴더 이름이 지금 폴더에 있으면 합치지 않고 " (2)"
- 내 판단: 같은 폴더에 같은 이름 파일을 넣으면 " (2)" (전에는 겹친 이름이 그대로 둘)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:17:39 +09:00
RyuJongJin f67e1e3a85 F7 낮은 화면에서도 [이동] 을 칩 줄 아래로 · F8 다운로드 주소 칸을 좁고 글자가 클 때만 제목 아래 줄로 · 214 c 시험을 보내기 시작 뒤로 (관리자 승인 10/21, 15 찾음)
- F7: 폰 가로 (900×412) 에서 떠 있는 [이동] 이 [자막 파일 추가] 를 반쯤 가렸다 (잘못 누를 수 있음) → 높이 < 500 × 글자 배율 이면
  206 의 배치 (칩 줄 아래) 를 씀. 처음에 높이 < 500 만 봤더니 960×600 · 글자 1.6 (ja) 에서도 가려 글자 배율을 곱함. 높이가 넉넉하면 그대로
- F8: 다운로드 화면 ja 412 글자 1.6 에서 제목이 넓어 주소 칸이 「動画...」 만큼으로 눌렸다 → 주소 칸이 200 보다 좁아질 때만 주소 칸 · [추가] 를
  제목 아래 한 줄로 (글 폭은 지금 글꼴 · 배율로 잼). 이를 위해 AppTopBar 의 좁은 배치 아래 줄을 "높이 48 고정" 에서 "48 이상" 으로
  (한 줄이면 예전처럼 48 가운데, 폭은 그대로 다 씀 - app_top_bar_test 201). 한 줄 막대 (넓은 화면) 에서는 늘 한 줄
- 214 c (move_settled_test): 전체 시험에서 한 번 실패 - 250ms 안에 원본 목록을 아직 읽지 않으면 새 파일까지 옮겨져 거짓 실패였다.
  보내기가 실제로 시작된 뒤 새 파일을 만들고, "새 파일을 잃지 않음 (원본 또는 받는 쪽)" 을 따로 확인
- 시험: windows_mkvdetail_shot_test 에 900×412 (1.0 · 1.6) · 1280×480 과 [자막 파일 추가] 겹침 확인을 더해 18개 통과,
  windows_bigtext_shot_test 60개 통과 (release\test\shots_f1), 전체 단위 1150개 통과, 214 c 혼자 5번 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:13:09 +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 ebaa054922 F6 MKV 자막 줄: 좁아 넘칠 때만 두 줄 (위 = 내장 · 트랙 이름, 아래 = 언어 · 문자셋 고르기 · 단추) · F5 · 206 캡처 시험 (관리자 승인 10/21, 15 찾음)
- 원인: 자막 줄은 한 줄 Row 라 좁은 폭 · 큰 글자 · 일본어에서 오른쪽으로 넘쳐 (1b31609: ja 412 글자 1.0 에서 65px, 외부 자막 + 1.6 에서 219px)
  끝의 편집 · 지우기 단추가 잘려 누를 수 없었다
- 고침: 한 줄에 드는 폭 (내장 표 · 이름 최소 60 · 언어 고르기 · 문자셋 · 단추) 을 지금 글꼴 · 글자 배율로 잰다 (고르기는 가장 긴 항목 글의 폭 -
  DropdownButton 이 그 폭을 씀). 모자랄 때만 두 줄, 아래 줄은 Wrap. 언어 이름은 "…" 로 줄이지 않음 (무엇을 골랐는지 보이게, 3a 결정).
  넓을 때는 예전 한 줄 그대로. 오디오 트랙은 줄이 없고 칩 (음성 n개) 뿐이라 해당 없음
- windows_mkvdetail_shot_test: 412 · 960×600 · 1280×720 × 글자 1.0 · 1.6 × ko · ja (내장 + 외부 자막). 넘침 없음 · 처음 자리에서 칩과
  [이동] 단추가 겹치지 않음 (206) · 끝까지 내리면 출력 줄이 단추 위 (F5 - 이미 있던 목록 끝 여백으로) 를 자리로 잰다.
  1b31609 에서는 6개 실패 (넘침), 이 고침으로 12개 모두 통과. HomePage 를 쓰는 단위 11파일 111개 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 12:11:22 +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 cb9e4433d3 끝 알림 문장 잇기: 일본어 · 중국어는 。 뒤에 빈칸 없이 (joinSentences) · 262 캡처 시험 (관리자 지시 10/21)
- l10n/tr.dart joinSentences: 한국어 · 영어는 빈칸, ja · zh 는 붙여서 (「移動しました。1 件は…」). 빈 조각은 뺌
- 파일 탐색기의 끝 알림 5곳 (복사 · 이동 끝, 긴 경로 영구 삭제, 휴지통 보내기, 휴지통 되돌리기, 끌어 놓아 옮긴 뒤) 이 이것으로 잇는다
- 시험: i18n_test (ko · en · ja · zh-Hans), moveleft 캡처 ja 960 직접 봄 - 빈칸 없음
- 262: windows_mkvend_shot_test - 가짜 FFmpeg 로 2개 묶음, 첫 동영상이 끝나는 순간 그 줄의 ■ 자리를 눌러도 ⟳ · ✕ 가 먹지 않고
  둘 다 성공. ko · en · ja × 412 · 960, 정식 판 후보 1b31609 로 6개 통과 (release\test\shots_v20261020_001 mkvend_*), after_1020 으로도 6개.
  i18n · explorer_conflict · batch 55개 통과

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:37:53 +09:00
RyuJongJin 616878d885 F3 복사 · 이동 끝 알림을 문장으로 잇기 · F4 키 암호 안내 "위의 [개인 키 암호] 칸" · 185 캡처 시험 (관리자 지시 10/21, 15 찾음)
- F3: "1개 항목을 옮겼습니다. · 1개는 원본에 남음 (건너뜀)" 처럼 마침표 뒤에 " · " 가 붙었다 → 뒤 조각도 문장 ("1개는 원본에 남았습니다 (건너뜀).",
  "받는 쪽이 더 새것이라 n개를 건너뛰었습니다." 등 5개) 으로 쓰고 빈칸으로 잇기 (en · ja · zh). 같은 꼴을 찾아보니 다른 끝 알림 (지우기 ·
  되돌리기) 은 이미 빈칸으로 이어 그대로. 옛 조각 글은 작업 기록 · 모니터링 · 확인 창에서도 써 열쇠는 남김
- F4: 키를 고른 뒤 안내가 창 맨 아래인데 "아래에 키 암호를" 이었다 → "위의 [개인 키 암호] 칸에 키 암호를 넣으세요" (칸 이름은 실제 칸 이름)
- 185: windows_dlcancel_shot_test - [다운로드 취소] 묻는 창 → [계속 받기] 면 그대로 받음 (가짜 백엔드), ko · en · ja × 412 · 960.
  정식 판 후보 1b31609 로 6개 통과 (release\test\shots_v20261020_001 dlcancel_*), after_1020 으로도 6개 통과
- 확인: analyze · l10n 빠진 것 0, explorer_conflict · move_settled · sftp 48개, moveleft · sshkey 캡처 통과 (release\test\shots_f1),
  ja 960 이동 알림 · en 412 키 안내 · ja 412 취소 창 직접 봄

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:25:43 +09:00
RyuJongJin 9c72320737 WIP 암호 보관함: PBKDF2 처음 60만 번 (관리자 결정 10/21 - OWASP 권장, 반복 수는 vault.json 에 있어 기기 확인 뒤 다시 정할 수 있음) · 시험: 같은 원본을 다시 넣어도 · 목록을 다시 쓸 때마다 새 무작위 파일 id (조각 nonce 가 (파일 열쇠, 조각 번호) 이므로 같은 id 를 다시 쓰지 않음을 보임) (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:22:49 +09:00
RyuJongJin b51a17a82b WIP 암호 보관함 1단계-1 암호 · 폴더 (관리자 결정 10/21, 설계안 위키 프로젝트/암호 보관함 · 루트 설계안 (10-21)): 화면 없이 바탕만 - 비밀번호 → PBKDF2-SHA256 (반복 수는 vault.json 에, 처음 30만 번 - d3 판단: 설계안의 60만은 이 PC 에서 10만 = 0.3초라 폰에서 수 초, 반복 수를 파일에 두어 나중에 올릴 수 있음, Isolate 에서) → AES-256-GCM 으로 무작위 보관함 열쇠를 감쌈 (비밀번호를 바꿔도 파일은 다시 암호화 안 함). 파일마다 무작위 id → 파일 열쇠 HMAC-SHA256, 1MB 조각마다 AES-256-GCM (nonce = 조각 번호, AAD = 머리 + 조각 번호 + 마지막 표시 - 바꾸기 · 바꿔 끼우기 · 끝 자르기 · 덧붙이기를 알아챔). 이름 · 크기 · 넣은 날은 암호화한 index.jjv 에만, 바깥 이름은 무작위. 쓰기는 .tmp → 이름 바꾸기, 목록이 기준 (넣기: 내용 → 목록, 지우기: 목록 → 내용), 다음에 열 때 끊긴 것 정리. 꺼내기는 다 풀고 인증이 맞은 뒤에만 그 이름으로. vault.json 형식 번호 - 모르는 새 형식은 열지 않음. pointycastle (MIT) 직접 의존 (dartssh2 를 통해 있던 4.0.0 그대로), 고지에 "보관함 암호화에도 씀" · 시험 10개 (AES-GCM · PBKDF2 알려진 벡터 · 틀린 비밀번호 · 변조 6가지 · 왕복 크기 · 끊긴 쓰기 4가지 · 형식) (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:21:43 +09:00
RyuJongJin fffb9d7dbc WIP X-plore 비교 5-2 앱 관리자 (사용자 결정 10/21, 관리자 판단, Android): 가운데 버튼 [앱 관리자] (Android 만, 버튼 끝에 - 좁으면 [더 보기]) - 모든 앱 목록 권한 (QUERY_ALL_PACKAGES) 없이 매니페스트 queries 의 LAUNCHER 로 실행할 수 있는 앱만, 화면 위에 "보이는 앱만 나옵니다 (모든 앱 목록 권한은 쓰지 않음)". 이름 · 판 · 크기 · 설치일, 이름 · 크기 · 설치일 정렬 · 찾기, [APK 백업] (Download/JJ_MKVMaker/apk, 이름_판.apk · 겹치면 (2), 나눠진 앱은 알림) · [앱 정보] (시스템 화면) · [지우기] (시스템 지우기 창, 시스템 앱은 없음). 아이콘은 그때그때 PNG 로 · 시험 (지도 읽기 · 백업 이름 · 화면 · 버튼은 Android 만) · APK 빌드로 Kotlin 확인 (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:15:28 +09:00
RyuJongJin 9f6c5c0bd5 SFTP SSH 키 파일 로그인: 키 형식 · 키 암호 · 서버 거부를 따로 알림 · 고를 때 바로 꼴을 봄 · 키 종류마다 실제 서버 시험 (사용자 승인 10/21, 관리자 지시)
- 이미 있던 것 (그대로): 서버 설정 [개인 키 파일 고르기] · 키 암호 칸, 키 내용은 안전 저장소 (sftp.key.<id> · sftp.kp.<id>) 에 두고
  파일 경로는 저장하지 않음, 설정 파일 · .bak · 보관본에는 평문 없음 (redactSecrets). "개인 키 붙여넣기" 는 없어 합칠 것 없음. 셸은 넣지 않음
- 더한 것: SftpFailure 에 keyFormat · keyPassphrase · keyRejected
  · checkPrivateKey: OpenSSH · PEM RSA · PEM EC (dartssh2 4.1.0 이 읽는 꼴) 인지, 암호가 걸렸는지. PuTTY (.ppk) 는 PuTTYgen 으로 바꾸는 법,
    PKCS#8 · 공개 키 (.pub) · 다른 파일은 고를 꼴을 알림 - [개인 키 파일 고르기] 에서 바로 (암호가 걸린 키면 "아래에 키 암호를 넣으세요")
  · parsePrivateKey: 암호가 걸렸는데 비었으면 "키 암호를 넣으세요", 못 풀면 "암호가 맞지 않습니다" (PEM 의 다른 오류도), 그 밖은 꼴
  · 키만으로 들어가다 SSHAuthError 면 "서버가 이 키를 받지 않습니다 (authorized_keys · 아이디)", 비밀번호도 있으면 "모두 거부"
- 시험 (실제 paramiko 서버 · Windows ssh-keygen): ed25519 OpenSSH (암호 · 없음) · rsa OpenSSH 암호 · rsa PEM · ecdsa OpenSSH 암호 ·
  ecdsa PEM 6종으로 로그인, 짝이 없는 키 = keyRejected, 암호 없음 = keyPassphrase, PuTTY · PKCS#8 · 공개 키 · 다른 파일 = keyFormat.
  틀린 키 암호 시험은 kind 를 keyPassphrase 로. sftp · sftp_stream 14개 통과, l10n 빠진 것 0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 10:53:44 +09:00
RyuJongJin 59f417552a WIP X-plore 비교 5-2 DLNA 보기만 (사용자 결정 10/21, 관리자 지시): 파일 탐색기 [미디어 서버 (DLNA)] (넓은 화면은 창 위 아이콘, 좁은 화면은 ⋮) - 같은 망의 미디어 서버를 찾아 (SSDP) 폴더 · 동영상 · 음악 · 사진 목록 · 200 개씩 [더 보기], 동영상 · 음악은 내장 플레이어로 (같은 폴더 차례대로), 사진은 임시로 받아 보기 화면. 서버 (내보내기) · 올리기 · 지우기 없음. 새 패키지 없음 (xml 은 이미 씀). 찾기는 Wi-Fi · 유선의 사설 주소에서만 (모바일 데이터 · VPN · 가상 어댑터로 보내지 않음 - SMB 찾기와 같은 localPrivateIPv4), 서버가 알려 준 주소 (설명 · 제어 · 미디어) 는 사설망 · 이 기기만 따름 (바깥 주소 항목은 "열 수 없음"), 받는 XML 은 4MB · 정한 시간까지 · 시험 (SSDP · 설명 · DIDL · 주소 제한 · 가짜 서버 Browse · 화면) (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 10:52:38 +09:00
RyuJongJin 6c5aef75a2 F2 AI 인터넷 서비스 창: 주소 예시 · 모델 도움 글을 3줄까지 (관리자 승인 10/21, 15 찾음)
- 412 ja 에서 주소 예시가 한 줄로 잘려 "--api 로 켠 …" (어떤 옵션으로 켜야 하는지) 가 보이지 않았다 - helperMaxLines 3 (다른 창의 도움 글과 같게)
- 같은 창의 모델 도움 글 (ComfyUI 체크포인트 이름) 도 3줄까지
- 캡처: windows_f1_shot_test 에 ComfyUI 로 바꾼 창 (ai_comfy) 을 더함. ko · en · ja × 412 · 960 의 6개 통과, ja 412 · en 412 ComfyUI 직접 봄 - 잘림 없음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 10:49:07 +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