- 도구 고침: setter 안의 ' closeAction = v' 줄을 선언으로 잡던 것 (타입은 글자로 시작 · 첫 선언만)
- 문서 주석 [AppSettings.run.x] → [RunSettings.x]
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 이미 옮긴 분야 뒤의 같은 이름 (s.tor.homeUrl) 은 바꾸지 않음
- browser_page 의 _CefView 자기 필드 cefWhenElevated 는 그대로 (같은 이름이라 잘못 바뀐 것을 되돌림)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- settings_group.dart 에 pickEnum (분야들의 읽기가 같이 씀 - fromJson 의 지역 함수 pick 대신)
- AppSettings.resolvedDownloadRoot 는 download.root 를 씀
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 부르는 곳: s.copyTasks → s.copy.tasks 꼴 (RsyncRun 의 자기 필드 copySkipNewer 는 그대로 - 같은 이름이라 잘못 바뀐 것을 되돌림)
- 문서 주석 [AppSettings.x] → [CopySettings.x] 등
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- ChannelModule.kt (31): 처리기 약속 (handle → 맡으면 true) · inBackground
- AppChannel.kt (193): secret · 뒤로 보내기 · 백그라운드 · 끝내기 · take… · 업데이트 설치 · 아이콘 · 작업 알림
- StorageChannel.kt (233): 전체 접근 · 저장소 목록 · 남은 공간 · 미디어 다시 읽기 · 주소 · 폴더 · 다른 앱으로 열기 · 공유
- SystemChannel.kt (221): Tor 웹 뷰 · Shizuku · 앱 관리자 · 망 종류 · 다운로드 프로그램
- OpenedFiles.kt (105): 받은 파일 읽기 · LaunchInbox
- MainActivity 는 엔진 · 처리기 등록만. 채널 이름 · 메서드 이름 · 인자 그대로, flutter build apk --debug 통과
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- 예전부터 있던 버그: [원본 지우기 (이동)] 로 넣는 도중에 잠그면 넣기는 멈추지만, 넣지 못한 원본이 bad 에 들어가지 않아 그 원본까지 지워졌다 (데이터 잃음)
- putVaultAdd: 잠겨 멈출 때 남은 항목의 top 을 bad 에 넣는다 → 넣은 것만 원본을 지우고 나머지는 그대로
- 약속 시험 (실제 시험 폴더 · 실제 보관함): 원본 4개를 넣다가 3번째에서 잠그면 1 · 2 만 지워지고 3 · 4 는 바이트까지 그대로. 고치기 전 코드에서는 4.bin 이 지워져 실패함을 확인
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- reader/reader_slots: 쪽 나누기 · 슬롯 계산 (순수)
- reader/reader_images: 그림 기억 (통째 · 반쪽 · 확대 · 작은 그림, dispose 를 맡음)
- reader/reader_controls: 계속 보기 시계 · 확대 · 볼륨 키 · 누른 자리
- reader/reader_page_view · reader_stage: 한 장 보기 · PageView 무대 (키 자리 그대로)
- reader/reader_bars · reader_bar_items: 위 · 아래 막대 · 갤러리 줄
- reader/reader_dialogs · reader_pdf_edit · reader_ai: Exif · PDF 편집 · AI
- reader_page 는 State 연결과 build 만, ReaderSlot · autoSplitsPage 는 export 로 그대로
- 약속 시험 test/reader_modules_test.dart (6개)
동작 그대로 (문구 · 툴팁 · 키 · 배치, 설정 이름 그대로). analyze 0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- monitor/transfer_widgets: 디스크 용량 · 진행 두 줄 · 원본 정리 칩 · formatRunStamp
- monitor/copy_task_card: 복사 · rsync 목록과 카드
- monitor/live_sync_flow: lsync 지우기 확인 · 시작 고르기 · 최종 정리 · 쌍 바꾸기 · 카드 메뉴
- monitor/live_pair_card: lsync 카드 · 원본 문제 안내 (탭 이동은 부르는 쪽 콜백)
- monitor_page 는 탭 틀과 lsync 목록만, 예전 이름은 export 로 그대로
- 약속 시험 test/monitor_modules_test.dart (6개)
동작 그대로 (코드는 줄 그대로 옮김, 설정 이름 그대로). analyze 0.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- 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>
- rsync_options (옵션 글 고치기 · 나누기 · 문제 찾기 · 고칠 방법 · 목록 파일 값)
- copy_commands (복사 방법 · rsync 인수 · MSYS 경로 · robocopy 묶음 · 성공 코드 · MSYS2 rsync 패키지)
- copy_output (rsync · robocopy 출력 읽기)
- sync_tools.dart 는 export 만 (부르는 쪽은 바꾸지 않음). 임시 이름 제외는 files/path_rules 를 부름
- 약속 시험: test/sync_modules_contract_test.dart
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- sftp_server (설정 · 실패 종류 · 오류 · 개인 키 읽기 · 호스트 키 지문 · 연결 꼴)
- sftp_remote (SftpRemote 원격 저장소 · 연결 · 소켓 다리 · SftpRegistry)
- sftp.dart 는 export 만 (부르는 쪽은 바꾸지 않음)
- 약속 시험: test/sftp_modules_contract_test.dart (실제 paramiko 서버 · 시험 폴더)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ftp_server (설정 · 실패 종류 · 오류 · 인증서 지문 · 이름 풀기 꼴)
- ftp_session (명령 채널 하나: 연결 · TLS · 로그인 · 명령 · 자료 채널 - 예전 _Session 을 FtpSession 으로)
- ftp_remote (FtpRemote 원격 저장소 · FtpRegistry)
- ftp.dart 는 export 만 (debugFtpLog 포함, 부르는 쪽은 바꾸지 않음)
- 약속 시험: test/ftp_modules_contract_test.dart (실제 pyftpdlib 서버 · 시험 폴더)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- subtitle_editor_panes.dart (새): SubtitleVideoPane · SubtitleCueTable (+ 머리 줄 · 줄) · SubtitleTransportBar
화면 필드 대신 편집기 · 위치 (ValueListenable) · 재생 상태 · 콜백을 인자로 받는다
- subtitle_editor_page.dart: 재생 · 저장 · 단축키만, 조각은 부르기만
- 약속 시험 1개 (실제 SubtitleEditorController)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- bookmark_ui.dart: 수정 · 새 폴더 · 새 즐겨찾기 창 · askText · 실행 취소 삭제 · 오른쪽 클릭 메뉴 · 끌기 조각
- bookmark_manager_page.dart (새): BookmarkManagerPage (위 조각을 부르기만)
- 부르는 쪽 import 만 고침, 약속 시험 1개 (실제 BookmarksController · 시험 폴더)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- file_listing (항목 · 정렬 · 폴더 읽기 · 찾기 · 크기 글) · windows_drives (드라이브 · 종류 · UNC 맨 위)
- path_rules (같은 경로 · 안에 있음 · 바깥 것만 · 전송 전 확인 · 임시 이름) · name_ops (이름 규칙 · 이름 바꾸기 · 새 폴더)
- transfer_guard (취소 · 원본을 읽을 수 없음 · 지우기 전 원본 확인 · 빈 폴더 정리)
- transfer_control (취소 · 속도 제한 · 알림 · 같은 이름 처리 - FileOps 가 이것을 이음)
- local_transfer (로컬끼리 복사 · 이동 · 맞추기 · 지우기) · any_transfer (원격이 섞인 복사 · 이동 · 맞추기)
- file_ops.dart 는 FileOps (고르기만) 와 예전 이름 그대로 export - 부르는 쪽은 바꾸지 않음
- 약속 시험: test/file_ops_modules_contract_test.dart (실제 시험 폴더)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 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>
- 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>
- 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>
- 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>
관리자 승인 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>
관리자 승인 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>
관리자 승인 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>
관리자 승인 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>
사용자 지시 (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>
점검 (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>
기준: 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>
- 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>
- 기준: 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>
충돌: 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>
- 보관함 깊은 폴더 (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>
- 날짜 열 폭 (열 비율 · 창 폭) 과 날짜 글 폭 (줄의 흐린 글 모양 · 지금 글꼴 · 기기 × 목록 글자 배율, 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>
- 화면 · 색 보정 창 (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>