- core/sync_preview.dart runOptionsText: 실행 인수 (rsyncArgs · robocopyRuns) 와 같은 규칙 - 원본 지우기 옵션은 빼고 이동일 때만 그 방법의 것,
robocopy 는 앱이 붙이는 것 (이동의 /MOVE /IS /IT /IM · 링크 /XJ · 더 새것 건너뛰기 /XO) 까지
- 부르는 곳: 모니터링 "실제 실행" · 실행 전 미리 보기 (effectiveRunText) · 탐색기 복사 · 이동 확인 창 · 실시간 동기화 [최종 정리] 창
- 고친 어긋남 (15 검토 F5): 탐색기 확인 창이 robocopy 이동을 /MOVE 로만 보였다 · [최종 정리] 창이 모니터링에서 고친 옵션이 있어도 늘 -avHPOg 로 보였다
- 약속 시험: 보이는 글 = 실제 인수 (robocopy 4 · rsync 4 · 현재 방식)
사용자가 보게 될 동작: 탐색기의 robocopy 이동 확인 창에 실제 옵션이 모두 보임 · [최종 정리] 창에 실제로 실행할 옵션이 보임
확인: analyze 0 · 단위 1482 ×2 · 통합 6/6 ×2 · base10 214장 0px · lsync_p0_shot ×2 · rsync_page ×2
(rsync_page 1회는 시작 3초 만에 시험 앱이 끝남 - media_kit 디버그 기록 파일의 PID 겹침, 이 고침과 무관 · 따로 보고)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- lib/core/files/same_file.dart: 크기 + 바뀐 때 ±2초, 받는 쪽 시각이 올린 때인 곳 (원격이 낀 앱 맞추기, 이동 아님) 은 받는 쪽이 더 새것도 같음.
SameFile.forAppSync(remote, move) · targetNewer
- 부르는 곳: 로컬 맞추기 (local_transfer) · 원격 맞추기 (any_transfer) · 미리 보기 (sync_preview) · 실시간 동기화 기다림 (sync_diff) ·
-u 건너뛰기 · 폴더 합칠 때 더 새것 지키기
- 고친 어긋남 (15 검토 F2): 원격으로 앱이 직접 맞출 때 받는 쪽이 같은 크기에 더 새 파일이면 미리 보기에 "바뀜" 으로 나왔는데 실제로는
보내지 않았다. 이제 미리 보기도 실제와 같은 판단 (rsync_runner viaDav · sync_preview_view direct 가 SameFile.forAppSync 를 넘김)
- 약속 시험: 판단 표 + 실제 파일로 미리 보기와 실제 맞추기 (anyMirror · localMirror) 가 같은지 - 원격 규칙 · 이동 · 로컬
사용자가 보게 될 동작: 원격으로 앱이 직접 맞출 때 받는 쪽의 같은 크기 · 더 새 파일이 미리 보기에서 빠짐 (실제로도 보내지 않던 것). 로컬 · rsync · 이동은 그대로
확인: analyze 0 · 단위 1479 ×2 · 통합 6/6 ×2 · base10 214장 0px · rsync_page · copy_sync_shot · lsync_p0_shot · live_excl_shot ×2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 장을 손으로 넘긴 뒤 [사진 정보] 창을 닫아 포커스가 보기 화면으로 돌아올 때, 화면 전체를 감싼 Focus 의 접근성 노드가 바뀌며
디버그 판에서 Flutter 접근성 assert ('node.built', rendering/object.dart) 가 났다 (rc2 에서도 같음)
- 갈라 보기: 장 넘기기 + 창 둘 다 있어야 남 · 그림 내용 · 아래 막대 · ColorFiltered 를 빼도 남 · 이 Focus 를 빼면 사라짐
- 고침: includeSemantics: false (키 받기 · autofocus 는 그대로, 화면 읽기 프로그램이 읽을 단추 · 그림은 안쪽에 그대로)
확인: analyze 0 · reader_dialog_semantics 2/2 ×2 (예전 늘 실패) · windows_reader_shot ×2 · 단위 1475 ×2 · 통합 6/6 ×2 · base10 214장 0px
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>
- lib/app/local_fs.dart: LocalFs 약속 (list · volumes · probe), RealLocalFs = 이 기기 그대로
- ExplorerDevice.listVolumes/probeDrive → ExplorerDevice.fs (LocalFs)
- ExplorerController(fs:) → loadDir(list:) (처음 값 listEntries)
- 빈 목록 경합: reloadOpen 이 끝날 때, 시작할 때 읽어 둔 것 중 닫힌 것만 잊음
(예전: 시작할 때 찍은 열린 목록으로 지워, 다시 읽는 동안 펼친 폴더가 비어 보였다)
- 결정적 시험 explorer_reload_race_test: 다시 읽기를 붙잡는 느린 LocalFs 를 생성자로 넘김
(실제 폴더 · 실제 목록). 예전 판에서는 실패 (펼친 폴더 [] ), 고친 판에서는 통과
확인: analyze 0 · 단위 1471 ×2 · 통합 6/6 ×2 · base10 214장 0px
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- MemorySecretStore.failRead/failWrite 를 없앰 → 시험 쪽 test/support/flaky_secret_store.dart
- WebProxy.debugAndroid/debugSetProxy 를 없앰 → WebViewProxyTarget 주입 (Android=ProxyController, 그 밖=없음)
- ExitGuard.forceAndroid 를 없앰 → PlatformServices.platform (PlatformInfo)
- JJ_NLLB_LOW_MEMORY 환경 변수를 없앰 → NllbTranslator(lowMemory:), 처음 값은 PlatformInfo.host
- archive_ops · rsync_launch · file_error 의 기본값을 PlatformInfo.host 로 모음
- 이름 바꿈: WebProxy.shownForTest → shown, debugReset → reset
- 보안: 남은 Tor 웹 뷰가 있는 동안에도 removeImplicitRules (localhost 까지 Tor 로)
- 약속 시험 platform_info_contract_test 3개
확인: analyze 0 · 단위 1470 ×2 · 통합 6/6 ×2 · base10 214장 0px
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
사용자가 보게 될 동작: 기기 안전 저장소를 읽지 못하면 저장된 비밀번호를 쓰는 기능이 열리지 않고, 환경 설정 > 보안에
까닭과 [다시 읽기] 가 보인다. 다시 읽히면 평소대로 마스터를 묻는다.
- 예전: 읽지 못하면 빈 것으로 보아 마스터가 없는 것처럼 문 (SecretGate) 이 열렸고, 그 상태에서 마스터를 정하면 진짜 값을 덮어쓸 수 있었다
- MasterLock.storeUnreadable: load 가 예외 대신 표시 (앱은 켜짐). ensure 는 한 번 다시 읽고 못 읽으면 false.
setMaster · setSuper · clearMaster · clearSuper · setAsk 는 MasterStoreUnreadable. reload()
- 보안 설정: 까닭 · [다시 읽기] (정하기 · 바꾸기 · 끄기 숨김). 보관함 [마스터로도 열기] 는 까닭을 알림
- 비밀번호 다시 저장 [다시 시도] 가 되면 마스터 잠금도 다시 읽음. settings_store 의 TODO(M0) 지움
- 약속 시험 master_store_unreadable_test 4 (읽기가 실제로 실패하는 저장소를 시험 파일 안에 - lib 흉내 플래그 쓰지 않음)
- 확인: 단위 1467 ×2 · 통합 6/6 ×2 · 캡처 214장 base10 과 같음
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>
- ExplorerSettings: 처음 값 defaultStyle (Windows totalcmd · Android xplore). 예전 파일에 모양 키가 없으면 그때의 X-plore.
Windows 에서 저장된 xplore 이고 물었다는 표시 (explorerStyleV2) 가 없으면 styleAskPending (저장 안 함)
- style_ask: 탐색기를 열 때 한 번 [바꾸기] (Total Commander) / [그대로] (X-plore) - 창 밖으로 닫지 못함, 어느 쪽이든 다시 묻지 않음.
환경 설정에서 직접 고르면 묻지 않음
- 약속 시험 explorer_style_contract_test: 새 설치 · 저장된 xplore (키 없던 예전 파일 포함) · windows/totalcmd 안 물음 · [그대로] · [바꾸기]
- X-plore 모양 (트리) 을 보는 기존 시험 14개 파일 + 공용 하네스에 style = 'xplore' 를 밝힘 (기대값 그대로, 관리자 승인 10/23)
- 설정 JSON 골든: 새 키 explorerStyleV2 한 줄 · 처음 값 출력의 Windows 모양 totalcmd 만 바꿈. 사전 4개 (en · ja · zh-Hans)
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>
- app_actions.dart 는 AppActions (설정 · 종료 버튼) 만 두고 옮긴 것을 그대로 내보낸다 (부르는 곳 그대로)
- 약속 시험: AppNavButtons.homeId · isCompact
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 웹 뷰가 화면 상태의 _clearProfile 을 직접 부르던 것을 인자 (clearProfile) 로 - 모듈이 화면에 기대지 않게
- 약속은 tor_test 의 torAddress · torBrowserArguments · torWebRtcBlockScript · TorViewHost 시험이 본다 (20 통과)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Windows · Android 가 복사해 쓰던 시작 단계 (startCore) 와 다운로드 연결 (createDownloads) 을 하나로 - 차례는 그대로
- Windows 끝내기 (WindowsQuit) · 실행 요청 처리 (handleLaunchRequest) · Android 시작 · 두 번째 창 · 도우미
- main.dart 는 옮긴 공개 이름을 그대로 내보낸다 (시험 · 다른 곳)
- 약속 시험: createDownloads · lastWorkText
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 화면 조각은 공개 위젯 (key 받음), 일은 AppController 가 · 화면은 부르기만
- 약속 시험: LogPanel · LogStrip · JobStatusIcon
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 로그인 쿠키 파일 쓰기 (Edge · Chrome 이 따로 하던 것) 를 writeLoginCookies 하나로
- 살려 둔 웹뷰 · Chrome 시작 제한 시간은 그 모듈이 갖는다 (CefView.startTimeout)
- 약속 시험: NavWatch · writeLoginCookies · deleteExportedCookies
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>
- 예전부터 있던 버그: [원본 지우기 (이동)] 로 넣는 도중에 잠그면 넣기는 멈추지만, 넣지 못한 원본이 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>
- 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>
- 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>