- StartMenu 는 run · userAreaLocked · shortcutPath 를 가진 인스턴스. StartMenu.user = 사용자 시작 메뉴 · HKCU (앱 조립 create 가 넘김),
StartMenu.locked(dir) = 늘 막힘 · 바로 가기 자리는 dir 아래 (PlatformServices 를 손으로 조립할 때의 처음 값). 예전 static run ·
userAreaLocked · shortcutPathOverride 를 바꾸던 것을 대신
- main · 설정 [시작 메뉴에 등록] 은 c.services.startMenu 를 부른다
- 시험: start_menu_test 는 가짜 run · 시험 폴더 바로 가기를 넘긴 인스턴스로 (사용자 영역 0), 손 조립 처음 값이 막혀 있고 사용자 시작 메뉴가
아님을 새로 봄 (2회 통과). start_menu_real_test (실제 사용자 시작 메뉴) 는 JJ_TEST_LAUNCHER 가 있을 때만 - 예전과 같음
- 사용자가 보게 될 동작: 없음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lan_scan.netKindsOf: 시험은 그 위 (WifiShareNet · findLanSmb) 를 넘기므로 바꿀 자리가 필요 없음 - 보통 함수로
- 점검만 (바꾸지 않음): TorService.dataDir 는 main 이 한 번 정하는 설정 (원격 서버 목록과 같은 꼴) · WebProxy.target 은 이미 주입 자리 ·
keepPlayingWhenHidden 은 켤 때 설정에 한 번 이음
- 시험: explorer_use_check 의 "복사 단추" 장면은 창이 뜨며 어두운 막이 덮이는 중에 찍혀 [←] 밝기가 흔들렸다 - 400ms 뒤에 찍음
(두 번 base11 214장 0px)
- 사용자가 보게 될 동작: 없음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ExplorerButton.explorerValues · defaultOrder · fromSettings 는 android 를 받는다 (부르는 쪽이 c.services.platform.isAndroid) -
예전 바꿀 수 있는 전역 함수 appsButtonSupported
- 보기 화면 볼륨 키는 c.services.platform.isAndroid (예전 ReaderPage.volumeKeysSupported)
- PlatformServices.keepScreenOn (처음 값 WakelockPlus - 예전 ReaderPage.keepScreenOn)
- 시험: app_manager · explorer_archive_trash · explorer_conflict · reader · reader_more 는 주입으로 (2회 통과). 볼륨 키 시험은
Android 조립과 Windows 조립 두 화면으로
- 사용자가 보게 될 동작: 없음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lan_scan.dart: deviceMetered (실제 - Android 만 묻고 PC 는 false, 물을 수 없으면 true) 는 그대로 함수로 두고, 바꿀 수 있는 전역 변수는 뺌
- remoteThumbsAllowedNow 는 c.services.isMetered 를 부름 (처음 값 = deviceMetered)
- 시험: remote_thumbs_test 는 isMetered 를 넘김 (2회 통과)
- 썸네일 캐시 상한 · 받기 허락은 이미 RemoteThumbs 생성자로 넘기는 값이라 그대로. netKindsOf (망 종류) 는 M4 LanFinder 몫
- 사용자가 보게 될 동작: 없음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- core/shizuku.dart PrivilegedFs: Shizuku 뒤쪽 · 루트 뒤쪽 · 임시 폴더를 한 곳에서. 앱은 켤 때 PlatformServices.privileged 를 건다
(Android 조립만 PrivilegedFs.device(앱 임시 폴더) 를 넘김, 원격 서버 목록처럼 한 번). 예전 ShizukuRemote.backend · rootBackend ·
tempDir · SuRoot.start (static) 를 대신 - SuRoot 의 프로세스 시작은 생성자로 넘김
- shizukuSupported · rootSupported (전역 함수) 를 빼고 c.services.platform.isAndroid (M1 PlatformInfo) 로
- Android 에서 Shizuku · 루트 내용을 잠깐 받는 곳이 시스템 TEMP (앱 캐시) → 앱 임시 폴더 (앱 데이터/tmp, 켤 때 비움) - 둘 다 앱 전용
- 시험: privileged_fs_contract_test (넘기면 걸고 안 넘기면 그대로 · device 꼴). shizuku · root · 보관함 시험은 PrivilegedFs.use 로 2회 통과
- 사용자가 보게 될 동작: 없음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/app/vault_location.dart: 보관함 폴더 · [보기] 로 잠깐 푼 파일 자리 · 꺼낼 폴더 고르기. device = 지금과 같은 실제 자리
(앱 조립 PlatformServices.create 가 씀), under(tempDir) = 앱 임시 폴더 아래 (손으로 조립할 때 처음 값 - 시험이 사용자 보관함 ·
앱 데이터를 건드리지 않음. 예전 flutter_test_config 의 전역 덮어쓰기를 대신)
- 보관함 화면 · 보기 세션 · 넣기 · 꺼내기 · 켤 때 남은 것 정리 (app_runtime) 가 c.services.vault (또는 넘겨받은 자리) 를 부른다
- KdfParams 점검: 반복 수는 이미 화면 · 만들기에 넘기는 값 (static 아님) - 바꾸지 않음. 실제 반복 수 (60만) 로 만들기 · 다시 열기 ·
읽기 · 틀린 비밀번호 시험을 vault_modules_test 에 (2회 통과, 4초)
- 시험: vault_location_contract_test (손 조립 처음 값 · 주입 그대로). 보관함 시험 · 캡처는 주입으로
- 사용자가 보게 될 동작: 없음 (자리는 그대로) - 보관함 캡처 앞 · 뒤 두 번씩 0px
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/ui/floating_actions.dart: 좁거나 낮으면 (글자 배율로 나눈 높이 500 미만 - F7) 내용 안 단추 줄, 넓으면 오른쪽 아래에 떠 있고
내용 아래를 단추 높이만큼 비움 (206). MKV 자세히 [이동] 단추가 부르기만 한다 (예전에는 화면 안에 판단 · Stack 이 있었음). 보이는 것 그대로
- MessageText 점검: 문장 잇기는 이미 joinSentences (tr.dart) 하나 - 손으로 빈칸 잇는 곳 없음, 바꾸지 않음
- 주입: PlatformServices.clock → AppLog(now:) (처음 값 실제 시계 - 작업 기록의 [시:분:초])
- 시험: floating_actions_contract_test (떠 있음 / 내용 안 · 비울 높이 · 첫 단추 맨 아래 · floatingInline 4 경우)
- 캡처 흔들림 (시험 쪽): mkvdetail (폴더 · 시각 · 기록 시각) · bigtext (JJ_SHOT_TMP 아래 · 드라이브 남은 공간 shotDevice).
b3_52 의 받는 중 파일 (.jjpart) 시각은 찍기 전에 고정해 보았으나 복사가 아직 쓰는 중이라 목록이 읽은 시각이 남아 그대로 (까닭을 시험에 적음)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- confirm_dialog.dart 하나: confirmAction (글만 묻는 꼴) 은 confirmDialog 를 부른다 (confirm.dart 지움, 16 파일 import 바꿈).
빨강은 테마 위험 색 (danger) 하나로 - 지우기 · 덮어쓰기 확인의 빨강이 다른 지우기 단추와 같아짐 (FF5252 → FF5C6C)
- 새 약속: cancelFirst (빨강이 아니어도 되돌리기 어려운 일은 첫 초점 [취소] - Enter 로 실행 안 됨) · canConfirm (체크 · 두 비밀번호가
같아야 [확인] 켜짐). 시스템 폴더 · 루트 보기 켜기 (설정), 루트 탭 경고 (탐색기), 보관함 비밀번호 바꾸기가 부르기만 한다.
창마다 글 · 단추 이름은 그대로
- confirmAction 도 같은 규칙: danger 면 첫 초점 [취소], 아니면 [확인] (관리자 결정 10/22)
- 시험: confirm_dialog_contract_test 에 cancelFirst · canConfirm · confirmAction 3개 (관리자 10/25 조건)
- 주입: LiveSync(now:) (처음 값 실제 시계 - 카드의 "마지막: HH:MM"). 시험 쪽 고정: b3 (폴더 · 시각 · CPU · 디스크) ·
lsync_p0 (폴더 · 시각 · 대상 디스크). b3_52 의 받는 중 파일 (.jjpart) 시각은 실제 복사가 만든 때라 그대로 (흔들림 2장 남음)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/ui/jj_chip.dart: 아이콘 없는 칩은 Material 처음 꼴 (고르면 앞에 ✓), 아이콘 칩은 고르면 그 자리에 ✓ 만 (62ba78d 규칙 -
예전에는 화면 · 색 보정 비율 칩 한 곳만 손으로). multi 면 FilterChip. 화면 · 색 보정 · 압축 · 찾기 · 일정 · 저장 공간 · 보기 ·
정리 · 받기 설정 · 즐겨찾기 · 자막 찾기 · 복사 방식 · 원본 정리 등 21곳이 부르기만 한다. 탐색기 왼쪽 / 오른쪽 창 고르기 칩은
고르기가 아니라 탭이라 그대로
- lib/core/picked_list.dart withPicked: 여럿 고르기 목록 켜고 끄기 (설정 3곳에 같은 코드가 있던 것)
- 시험: jj_chip_contract_test (아이콘 ✓ 바꾸기 · 처음 꼴 · multi · 못 누름 · withPicked)
- 앞 · 뒤 캡처 9 묶음 132장 각 두 번: 앞 · 뒤 0px (보이는 것은 그대로)
- 시험 쪽: monitor_shot 도 고정 폴더 · shotServices (CPU · 메모리 · 디스크 · 대상 디스크)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- pane_view 의 경로 줄 (폴더 + 파일 목록 · TC 모양 오른쪽): 예전에는 끝을 "…" 로 잘라 지금 폴더가 안 보였다 → TailText (앞을 줄임)
- TailText 의 폭 재기를 path_label 의 textWidth 로 (글 방향 · 다 쓴 TextPainter 놓기 - 예전에는 매번 새로 만들고 놓지 않음)
- AdaptiveRow · ColumnTable 점검: 좁을 때 모양을 바꾸는 다른 곳은 목록 / 자세히 세로 쌓기 · 칩 줄 따로 등 "앞 묶음 · 뒤 묶음" 꼴이 아니라 그대로.
열 판단은 이미 columnLayout (순수 함수, 312 조합 시험) 하나를 열 머리 · 줄이 같이 씀
- 시험 쪽 흔들림 고정: support/shot_services (shotServices - CPU · 메모리 · 디스크, shotDevice - 드라이브 남은 공간) 를
check_shot · explorer_shot · explorer_text 가 같이 씀. explorer_text 는 JJ_SHOT_TMP 아래 고정 폴더 · 시각, xplore 는 고정 폴더 ·
시각 · 압축 안 항목 시각
- 사용자가 보게 될 동작: 탐색기 두 창 · 폴더 + 파일 목록의 오른쪽 위 경로 줄이 "…\Videos\Movies" 처럼 끝이 보임
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/ui/row_fit.dart: fitRow (판단만 - 82a87da 그대로) + FitButtonRows (그 판단대로 한 줄 / 두 줄로 그림, 단추 크기 그대로,
소리 막대만 남는 폭 최대 100). 재생 화면은 부르기만 한다 (player_page 580 → 576줄)
- 재생 목록 모듈 (core/playlist.dart): isPlayableFile · samePlayKind · folderPlaylist. buildPlaylist 의 형제는 고른 파일과 같은 종류만,
폴더 [재생] 은 동영상이 없으면 소리 파일 (안내 글 "이 폴더에 재생할 동영상 · 소리 파일이 없습니다." - en · ja · zh 사전 함께).
컨트롤러 (playback_prep) · 탐색기 (explorer_buttons · open_flow) 는 부르기만
- 시험: row_fit_contract_test (새) · player_test 약속 줄 · full_player_test 실제 mpv 장면 (82a87da 에서 옮김).
explorer_flows_contract_test 의 알림 글을 새 글로 (틀 것이 없으면 알림은 그대로)
- full_player_test: 앞 판은 mp3 목록이 [ep1.mkv, Other - Track 2.mp3] 로 실패 (결함 재현), 뒤 판은 목록은 통과하나
"audio 재생 시작" 에서 멈춤 - 이 PC 는 소리 출력 장치가 모두 꺼져 있음 (AudioEndpoint 모두 Unknown). 조절 줄 장면은 기기 (노트 10+) 확인 몫
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- subtitle_editor_panes.dart (예전 subtitle_editor_page 의 표): 두 단일 때 위 # · 시작 · 끝, 아래 내용 · 단추 (오른쪽 끝).
예전 (62ba78d) 은 단추를 위 단에 넣고 누를 자리를 40 으로 줄여 360 에서 위 단이 43px 넘쳤다. 단추는 기본 누를 자리 그대로
- windows_ui2_shot_test (7247aeb 에서 옮김): 360 · 412 · 960 × ko · ja, 넘쳐도 먼저 찍고, F11 (✕ 화면 안 · [모두 초기화] 이름 ·
안내 글 숨기지 않음) · F9 (줄 단추 누를 자리 48 + 밀도 조정) 을 본다. 앞 판은 360 자막 편집에서 43px 넘쳐 실패
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/ui/jj_header_row.dart: 아이콘 · 제목 (titleLines 줄까지, "…") · 설명 (넓으면 옆, 좁으면 제목 아래 - 숨기지 않음) ·
단추 (늘 오른쪽 끝에 다 보임, 좁으면 narrowActions). 다운로드 창 · 재생 목록 판 · 즐겨찾기 판 · 작업 현황 판 ·
저장 공간 정리 창 · 화면 · 색 보정이 부르기만 한다
- F11 (7247aeb): 화면 · 색 보정 제목 줄 - 560 미만이면 안내 글은 제목 아래, [모두 초기화] 는 같은 이름의 아이콘 단추, ✕ 늘 보임
- G1 (a22832d): 다운로드 종료 창 제목 두 줄까지 · ✕ 늘 보임
- G2 (a22832d): jjTitleBar 에 lowerActions - AI 비교는 600 미만이면 원본 / 올린 것 고르기만 둘째 줄 가운데, [저장] 은 그대로.
앱 안 폴더 고르기는 단추 셋이 함께 둘째 줄로
- 시험: jj_header_row_contract_test · windows_hdr360_shot_test (a22832d 에서 옮김 - 앞 판은 360 에서 47px 넘쳐 실패)
- 캡처 흔들림 고정 (시험 쪽): bigtext (폴더 · 기록 시각 · 대상 디스크) · magnet (움직이는 "준비 중…" 막대, TickerMode)
- 주입: AppController.note(at:) (처음 값 지금) · PlatformServices.diskSpace + DiskSpaceInfo(space:) (처음 값 실제 디스크)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/ui/jj_title_bar.dart: 제목은 늘 한 줄 (넘치면 "…", 경로는 TailText 로 끝이 보이게) · 넓은 단추를 가진 쪽은 좁으면
단추들을 제목 아래 둘째 줄로 (거기도 넘치면 그 줄만 줄임, 숨기지 않음). 휴지통 · 보관함 · 저장 공간 · 압축 · 글 보기 ·
찾기 결과 · DLNA (경로) · AI 비교 · 앱 안 폴더 고르기 등 17곳이 부르기만 한다
- 바뀐 동작: AI 올리기 비교 · 앱 안 폴더 고르기는 좁은 폭에서 단추가 제목 아래 줄로 (예전에는 412 ja 폴더 고르기가 넘쳤음)
- 주입: WifiSharePage.random (접속 코드 난수, 처음 값 안전한 난수) · Vault.add(added) (넣은 때, 처음 값 지금)
- 시험: jj_title_bar_contract_test · titlebar_places_shot_test. wifi (폴더 · 코드 · 스크롤 막대) · vault (폴더 · 넣은 날) 고정
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/ui/jj_field.dart: 칸 이름 짧게 · 도움 글 칸 아래 3줄까지 (helperLines 로 늘림) · 오류 글 · 칸 끝 단추 · 여러 줄 · 테두리 · 가림.
WebDAV · FTP · SFTP · SMB 서버 창 · AI 서비스 · 해시 비교 · 시드 · 패턴으로 고르기 · 동기화 일정 · 이름 틀이 부르기만 한다.
SecretField 는 JjField 위에 눈 단추만 더한다
- 바뀐 동작: 패턴으로 고르기 · 동기화 일정 창의 도움 글이 한 줄에서 "…" 로 잘리던 것이 3줄까지 보임 (F2 와 같은 결함)
- 시험: jj_field_contract_test · field_places_shot_test (패턴 · 일정 창, 캡처가 없던 곳)
- 시험 쪽 고정: b6 · p3 · xptools 도 고정 폴더 · 시각 (pinTestTimes 가 만든 · 바뀐 · 열어 본 시각 모두)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/ui/secret_field.dart: 비밀번호 · API 키 · 키 암호 칸 (처음 늘 가림, 눈 단추로 켜고 끄기, 자동 고침 · 추천 끔,
바깥 가리기로 칸 여럿을 단추 하나로). WebDAV · FTP · SFTP · SMB · AI 서비스 · 압축이 부르기만 한다
- 눈 단추 모양 · 툴팁을 하나로 (AI 창의 채운 24 아이콘 → 다른 곳과 같은 테두리 18, 툴팁 '보이기/가리기'),
쓰지 않게 된 사전 글 '비밀번호 보기/숨기기' 를 en · ja · zh 에서 뺌
- 시험: secret_field_contract_test (처음 가림 · 켜고 끄기 · 칸 여럿 · 300/412 · 배율 2 넘침 없음)
- 시험 쪽 고정: testFixedTempDir · pinTestTimes (폴더 이름 · 파일 · 폴더 시각), 시험 SFTP 서버 fixedPort · fixedHostKey
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- FTP 평문 띠: 제목 "평문 FTP: 암호화 안 됨" (굵게) · 설명은 아래 보통 굵기 · 글 앞 ⚠ 뺌 (자물쇠 아이콘 하나). 라디오 이름 "⚠ 평문 FTP (암호화 안 됨)" 은 띠가 아니라 그대로
- 동영상 오류 띠: 제목 "실패" (있던 사전 글) · 오류 글은 아래 설명 (골라 복사)
- 다른 띠: 탐색기 · 실시간 동기화는 이미 짧은 제목 + 설명, AI 그림 안내 · AI 서비스 경고는 한 문장 (그대로)
- 사전 en · ja · zh: 새 제목 3 · 설명은 예전 번역에서 ⚠ 만 뺌 (빠진 번역 0)
- 캡처 흔들림 (시험 쪽에서만, lib 그대로): check_shot 의 위 막대 CPU % (실제 값 5% ↔ 7%) → 시험이 늘 같은 값을 내는 사용량 원천을 조립에 넘김 ·
FTP 960 의 창 스크롤 막대가 사라지는 중간에 찍힘 → 찍기 전 1.5초 기다림 · 커서 깜빡임 고정 (debugDeterministicCursor)
- 새 기준: notice_places · ftp_shot · check_shot 을 두 번 찍어 이번에 바뀐 자리 모두 0px (check_shot 의 37 · 65 · 94 는 실행마다 임시 이름 · 시각이 달라 예전부터 흔들림)
사용자가 보게 될 동작: FTP 평문 경고 띠의 제목이 짧아지고 설명이 아래로 · 동영상 오류 띠의 제목이 "실패"
확인: analyze 0 · 단위 1525 ×2 · 통합 6/6 ×2 · base10 214장 0px
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- NoticeBand(icon, title, body, actions, color): 연한 바탕 · 테두리 · 둥근 띠, 제목 굵게 · 설명 작고 흐리게 · 단추는 넘치면 다음 줄 (Wrap).
탐색기 pane_notices 의 _noticeBox 와 같은 모양 (탐색기 캡처 214장 0px)
- 약속 시험 notice_band_contract (27): 폭 300 · 412 · 960 × 글자 배율 1 · 1.3 · 2 × ko · en · ja - 넘침 없음 · 단추가 띠 안 · 좁고 크면 다음 줄
- 캡처 시험 notice_places_shot (나머지 자리를 모으기 전후 견줄 것): 실시간 동기화 카드 (멈춤 · 마스터 기다림) · 동영상 자세히 오류 상자 · AI 서비스 경고
사용자가 보게 될 동작: 바뀌는 것 없음 (탐색기 띠 모양 그대로)
확인: analyze 0 · 단위 1525 ×2 · 통합 6/6 ×2 · base10 214장 0px
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 시험 창의 브라우저 화면이 804 너비라 도구 막대가 좁은 꼴 (640 미만) - 번역 · 작업 현황 단추가 [더 보기] 메뉴 안에 있어
툴팁으로 찾던 시험이 실패했다. 앱 쪽 문제 아님 (관리자 10/24: 시험 쪽이면 기대값 그대로, 메뉴를 열어 누름)
- tapToolbar: 넓으면 그 단추, 좁으면 도구 막대 안의 [더 보기] → 같은 항목. 고른 결과는 메뉴가 닫힌 뒤 들어오므로
(번역이 도는 동안 그리기가 느림) 메뉴가 닫힐 때까지 기다림
확인: analyze 0 · translate_split 1 ×2 · web_translate 1 ×2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- windows_b6_input · rsync_page: 시험이 X-plore 모양을 직접 고름 (TC 는 폴더를 [이름], 파일은 이름 · 확장자를 다른 칸에 보여 이름 글을 찾지 못했다)
- windows_move_left_shot · windows_rsync_narrow_shot: X-plore 시험은 그대로 두고, Total Commander 모양으로 같은 일을 보는 단계를 더함
(관리자 10/24: 사용자가 TC 로 쓰므로). move_left TC: [D] 고르기 → F6 이동 → 알림 → Enter 로 원본 D 에 들어가 남은 것만.
rsync_narrow TC: [sub] · [rsub] 고르기 → 좌 → 우 확인 창. 캡처 이름은 …_tc_…
확인: analyze 0 · b6_input 2 ×2 · move_left 12 ×2 · rsync_narrow 12 ×2 · rsync_page 3 ×3
(rsync_page 1회째는 시작 4초 만에 시험 앱이 끝나 did not complete - 시험 논리와 무관, 그 뒤 3회 모두 통과)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Tor: debugRunning · executable 없앰 → 떠난 뒤 잠시 켜 두기를 IdleStop 모듈로 (schedule · cancel · stopNow).
환경 설정 > Tor 는 IdleStop 을 받음 (처음 값 = 앱의 Tor), [지금 끄기] = stopNow
- Wi-Fi 공유: debugLoopbackOnly · debugAddresses · loopbackOnly 인자 없앰 → WifiShareNet 주입 (열 주소 · 설정 열기).
WifiSharePage(net:) 가 debugLaunch 를 대신함. debugFail 없앰 - 시험이 실제 다른 루프백 주소 (127.0.0.x) 에서 틀린 코드를 보냄
- 관리자 권한: Elevation.debugElevated 없앰 → PlatformInfo.elevated (조립 주입), CefView(elevated:)
- CEF 시작 시간: 바꿀 수 없게 (const) - 시험은 가짜 시간을 넘김
- 단일 실행: debugStopListening 없앰 - 시험이 instance.json 을 아무도 듣지 않는 포트로 (받는 곳이 죽은 첫 창)
- SMB 찾기: 전역 debugFindSmbServers 없앰 → PlatformServices.findLanSmb 주입
- 남은 @visibleForTesting (들여다보기만): browser_page · tor_page debugNav, secret_store dpapiAt, reader_page dropMissingFiles
확인: analyze 0 · 단위 1473 ×2 · 통합 6/6 ×2 · base10 214장 0px · windows_wifi_shot ×2 · windows_smbfind_shot ×2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- recycle_bin: RecycleBinBackend 약속 + WindowsRecycleBin (이 기기의 휴지통). 전역 recycleBinForTest · recycle() · restoreRecycled() 없앰
- delete_ops: deletePaths(bin:) · undoRecycle(bin:) - 처음 값 WindowsRecycleBin
- ExplorerDevice.recycleBin → ExplorerFlows · ExplorerDeleteFlow(recycleBin:)
- 시험: useTestRecycleBin(device) 가 시험 기기에 시험 폴더 안의 휴지통을 넣음. 영구 삭제만 하는 약속 시험 4개는
휴지통으로 보내면 실패하는 것을 넘김 (사용자 휴지통에 닿지 않게). 넘겨받은 휴지통 약속 시험 1개 더함
- 시험용 휴지통: 자기 폴더가 없어졌으면 다시 만들지 않고 그대로 알림 (진단)
- 전부터 있던 실패 2개 고침 (E6 부터 Windows 처음 모양이 Total Commander 라 이름 · 확장자가 다른 칸):
windows_check_shot_test · windows_b3_shot_test 가 X-plore 모양을 직접 고름
확인: analyze 0 · 단위 1472 ×2 · 통합 6/6 ×2 · base10 214장 0px · windows_check_shot ×2 · windows_b3_shot ×2
(첫 확인의 통합 1회에서 412 지우기가 '경로를 찾을 수 없음' 으로 11장 벗어남 - 다시 4회 모두 0px, 원인 미확인)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 원인 (실제 앱): 목록 줄 (TC · '폴더 + 파일 목록') 의 폴더 · '..' 는 한 번에 열려, 두 번 누르면 두 번째 누르기가 같은 자리의 '..' 에
맞아 도로 나왔다
- TC 모양: 폴더 · '..' 도 한 번 = 고르기, 두 번 = 열기 (ClickPolicy doubleOpens - Total Commander 와 같게)
- TC 모양: Enter = 열기 (폴더는 들어가기, 파일은 열기) - 바꿀 수 있는 키 동작 'open', 처음 키는 TC 모양일 때만 Enter
- '폴더 + 파일 목록': 한 번 열기는 그대로, 연 직후 두 번 누르기 시간 (300ms) 안의 다음 누르기는 버림 (마지막 틀 시각으로 잼)
- 약속 시험: 누르기 표 (TC) · TC 한 번 / Enter / '..' 두 번 · 목록 배치 곧바로 두 번째 누르기 · 시간 지난 '..' 한 번
- 점검 시험: TC 를 두 번 누르기 · Enter 로 되돌림 (실제 시간에서 들어가기 · 나오기 됨), 목록 배치 단계 더함 - 214장 2회 같음 (base10)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 지운 뒤 초점: 지운 줄의 다음 줄로, 마지막이었으면 앞 줄로 (TC · X-plore 같음) - focus_after_delete (순수 함수, 약속 시험 4) +
지우기 흐름이 부름. 실제 화면 시험: TC 목록에서 F8 단추로 지우면 다음 줄이 지금 줄
- TC: 확장자 칸이 없으면 (좁은 줄 · 좁아 숨긴 열) 이름에 확장자를 붙인다 ('notes.txt') - 정보를 숨기지 않게.
기존 큰 글자 시험 3곳의 TC 기대를 'a' → 'a.txt' 로 (이 결정에 따른 것, 주석에 적음)
- 탐색기 점검 시험: TC 전용 단계 (Backspace 로 맨 위 · 메뉴 [열기] 로 들어가기 · Backspace 로 나오기 · F5 · F6 · F8 · 지운 뒤 초점,
단계마다 폴더 시각 다시 고정 + Ctrl+R). 두 번 누르기는 이 실제 시간 시험에서 열기로 잡히지 않아 단위 약속 시험이 본다
- 확인: 단위 1461 ×2 · 통합 6/6 ×2 · 캡처 201장 2회 0px 같음 (base9) · X-plore 는 '삭제 확인' 3장만 바뀜 (초점)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- TC 모양: 트리 대신 지금 폴더의 목록 (paneListRows - '폴더 + 파일 목록' 의 목록과 같은 함수, 목록의 스크롤).
사용자가 고른 '폴더 + 파일 목록' 배치 · Rsync 화면은 그대로 트리
- tc_key_bar: F3 보기 · F4 편집 · F5 복사 · F6 이동 · F7 새 폴더 · F8 삭제 - 이미 있는 동작을 부름
- tc_drive_space: 창 위 남은 공간 / 전체 - ExplorerDevice.diskSpace 로 받음 (시험은 TestExplorerDevice.space)
- 좁은 창 (창 폭 200 아래, narrowRowWidth): 아이콘 칸 줄임 · 끌기 손잡이 숨김 · 열 대신 이름 먼저 (크기 · 날짜는
두 줄이 들어가는 줄 높이에서 이름 아래 - TC 26 은 이름만) · 열 머리도 이름만. X-plore · TC 가 같은 ExplorerRowView
- 약속 시험 explorer_tc_look_test 4개. 점검 시험은 X-plore · TC 두 모양을 찍는다 (폴더 시각 · 남은 공간 고정)
- 확인: 단위 1456 ×2 · 통합 6/6 ×2 · 캡처 180장 2회 정확히 같음 (base8) · X-plore 1920 · 960 은 base7 과 같음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/ui/notice.dart 의 noticeDurationForTest 를 지움 (lib 에 시험 전용 길이를 두지 않음 - 관리자 10/23)
- 탐색기 점검 시험은 MaterialApp 을 NoticeTiming 으로 감싼다. 약속 시험: 감싸면 그 시간, 없으면 10초
- 확인: 캡처 2회 90/90 같음 · 앞 판 (5303663) 과도 90/90 같음 → base7
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- notice.dart: appNoticeDuration (10초, 앱의 값) · noticeDuration (읽기) · noticeDurationForTest (시험만, @visibleForTesting)
- 탐색기 점검 시험: 알림이 실제 시간으로 닫히지 않게 두고, 정한 자리 (복사 알림은 선택을 끈 뒤 · 휴지통 알림은 이동을
누르기 전) 에서 닫는다 - 찍는 때와 10초가 겹쳐 장면 14 · 27 이 실행마다 달라지던 것
- 확인: 같은 판 2회 90/90 픽셀까지 같음
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 일반: 즐겨찾기 · 저장 공간 정리 · 바뀐 기본값 알림 · 안쪽 → 바깥 · 비밀번호 기억 · 휴지통 · 모든 파일 안내 (allFilesHint2)
- imageExts 는 보기 화면 분야 (ReaderSettings) 로
- 표시 cookieScopeV2 → 다운로드, robocopyLinksV1 → 복사 분야로
- AppSettings 에 남은 것: 분야 목록 · 모르는 항목 보존 · 비밀 값 빼기 · 바뀐 기본값 알림 · 실행 중 값 (webViewDataDir)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 도구 고침: 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>
- 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>
관리자 승인 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>
충돌: 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>
- 날짜 열 폭 (열 비율 · 창 폭) 과 날짜 글 폭 (줄의 흐린 글 모양 · 지금 글꼴 · 기기 × 목록 글자 배율, 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>