Commit Graph

59 Commits (6b60f348e2bedd08cb6786594b1f5345901aaa74)

Author SHA1 Message Date
RyuJongJin 6b60f348e2 WIP 마그넷: 인터넷 IPv6 가 없으면 (Tailscale ULA 뿐) aria2 의 IPv6 끔 - 시작되지 않던 것 (28 확인) · 정한 시간 (처음 60초) 동안 메타데이터 · 피어가 없으면 줄에 이유 후보 · [다시 시도] · 실제 마그넷 받기 통합 시험 (JJ_REAL_MAGNET=1) (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 11:32:40 +09:00
RyuJongJin 65f5e49aad next4: next2 7cd8eb8 (M2 · 줄바꿈 되돌림 · 글 뷰어 이모지) 합침
# Conflicts:
#	assets/l10n/en.json
#	assets/l10n/ja.json
#	assets/l10n/zh-Hans.json
2026-10-19 22:35:14 +09:00
RyuJongJin 7cd8eb8b15 WIP 글 뷰어: 긴 줄을 재는 조각이 이모지 (두 단위 글자) 가운데서 끊겨 "not well-formed UTF-16" 이 나던 것 (검토 대기)
28 지적 (10/19, 4716537 의 회귀): 이모지가 든 긴 줄에서 cut 콜백의 재는 조각 끝 (from + size) 이 서로게이트 쌍 가운데 (0xD800 다음) 에 떨어지면
반쪽 글자로 TextSpan 을 만들어 painting 오류 "string is not well-formed UTF-16" 이 화면마다 30번 나고, 그 재기를 버리고 더 큰 조각을 다시 쟀다
(화면에 빠진 글은 없었음).
→ 조각 끝이 두 단위 글자의 뒷쪽 (0xDC00~0xDFFF) 이면 한 칸 앞에서 자른다 (viewerRows 뒤쪽과 같은 처리).
같이: 4716537 에서 l10n 검사에 걸린 폭 재기 글자 '가' 에 // l10n-skip (화면 글이 아님).

확인: integration_test/windows_textview_shot_test.dart 에 이모지 줄 ('abc😀' × 3000, 412 · 960) 과 "그리는 중 오류 없음" 을 더함 -
고치기 전 코드로는 Windows 에서 UTF-16 오류 10건으로 실패, 고친 뒤 8 통과 · 오류 0 (release\test\shots_textview_emoji).
xplore_tools_test (새 1: 이모지 긴 줄 · 조각이 반쪽 이모지로 끝나지 않음 - flutter_tester 엔진은 반쪽 글자를 받아들여 회귀는 Windows 캡처로 잡음) 8 통과,
analyze 문제 없음, l10n 빠짐 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 22:30:46 +09:00
RyuJongJin 092b68a28f next4: next2 (6278403) + next3 (63ef362) 합침 - 시험판 977 2026-10-19 22:15:47 +09:00
RyuJongJin 47165371eb WIP 글 뷰어: 긴 줄을 실제 글꼴로 줄을 바꿔 본 자리 (네 줄 끝) 에서 나눔 - 넓은 글자 · 고정폭이 아닌 글꼴에서도 줄 끝이 비지 않게 (검토 대기)
관리자 지시 (10/19, 27baf91 의 ③ 남은 것): 한글 · 한자처럼 넓은 글자가 섞인 줄도 줄 끝이 비지 않게.
Windows 캡처로 보니 'monospace' 가 실제로 고정폭이 아니라, 글자 수로 세면 (가장 넓은 'M' 기준) 영문 줄도 넷째 줄 끝이 비었다.
- 화면에서는 TextPainter 에 Text 와 같은 글꼴 · 글자 크기 · 기기 배율 · 폭으로 조각을 그려 보고, 다섯째 줄이 시작하는 자리 (= 네 줄의 끝) 에서 자른다.
  (조각 창은 화면 한 줄 글자 수 × 8 부터, 다섯 줄이 안 되면 두 배로). 한 번 나눈 결과는 글 · 폭 · 글자 크기가 같으면 다시 쓰지 않는다.
- viewerRows 는 cut (줄 끝 자리) 이 없으면 글자 폭 단위로: 넓은 글자 (isWideChar - 한글 자모 · 음절, 한자 · 가나 · 한중일 기호, 전각) 와 이모지는
  잰 비율 (기본 2) 칸으로 센다. 두 단위 글자는 반으로 자르지 않는다.
- 새 캡처 시험 integration_test/windows_textview_shot_test.dart (영문 · "한x" 섞임 · 한글만, 412 / 960).

확인: Windows 캡처 (release\test\shots_textview2 - 고치기 전 shots_textview 에서는 영문 · 섞인 줄의 넷째 줄 끝이 비었음) 6 통과,
xplore_tools_test (새 2: 넓은 글자 칸 세기 · 한글 섞인 긴 줄의 조각이 화면 네 줄) 7 통과, explorer X-plore g · h 통과, 임시 폴더 흔적 0, analyze 문제 없음.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 22:05:43 +09:00
RyuJongJin 25a0cd3c96 WIP 통합 시험 · 캡처의 임시 폴더: 시험 끝에 (실패해도) 지우기 · test_temp_check 가 통합 시험에도 (검토 대기)
관리자 지시 (10/19, 28 이 찾음): Windows 캡처 · 통합 시험 (integration_test, -d windows) 이 %TEMP%\jj_* 시험 폴더를 남겼다
(시험 본문 끝의 deleteSync 는 실패하면 건너뛰고, 앱 · WebView 가 파일을 잡고 있으면 지우기가 실패했다).
- 새 integration_test/support/temp_dir.dart: testTempDir(prefix, {base}) - 만들면서 addTearDown 으로 지우기를 걸어 실패해도 지운다.
  잠겨 있으면 0.25초씩 20번 다시 (실제 시간 - 가짜 시계 밖), 긴 경로는 \?\, 끝내 못 지우면 알리기만.
  통합 시험 26개 파일의 Directory.systemTemp.createTempSync('jj…') 를 모두 이것으로 (JJ_SHOT_TMP 를 쓰는 캡처 도우미 포함).
- tool/test_temp_check.ps1: integration_test 의 이름 (testTempDir 포함) 도 모은다. 넘겨받은 .dart 파일이 있으면 그 파일과 그것이 import 하는
  support 파일의 이름만 센다 - 같은 때 다른 세션 · worktree 가 돌린 시험의 폴더 (jj_explorer_ · jj_sync_ · jj_fake_recycle_) 를 세던 거짓 실패를 없앰.
  시험 소스에 없는 이름의 새 jj 폴더는 참고로만 보인다. 사용: test_temp_check.ps1 integration_test\windows_b6_shot_test.dart -d windows
- com_guard_test 의 쓰지 않는 dart:io import 정리 (analyze).

시험: windows_b6 · windows_xplore · windows_ftp · windows_wifi 캡처 통과 · 새로 남은 것 0 (test_temp_check), analyze 문제 없음.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 21:51:39 +09:00
RyuJongJin cfed8fa355 WIP 145 초기화 창 캡처 (ko · en · ja × 412 · 960, 시험 windows_reset_shot): 잘림 없음 · 문구를 사실대로 - SFTP · SMB · FTP 비밀번호 · 키도 지움, "앱 설정 전체" 는 파일 탐색기 즐겨찾기도 지움 (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 21:16:49 +09:00
RyuJongJin 722edc8ed1 WIP 177 Rsync 실행 전 비교 (미리 보기 · 지울 목록) 가 옵션의 거르기 (--exclude · --include · --exclude-from · --filter · --delete-excluded) 를 실제 rsync 와 같게 따름 (검토 대기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 21:09:13 +09:00
RyuJongJin 6b6c23dc49 Merge commit '53a7418' into next 2026-10-18 04:11:01 +09:00
RyuJongJin 53a74183a7 WIP 412 캡처의 잘림: 서버 창 칸 이름은 짧게 · 설명은 helper, 해시 비교 칸, 날짜 고르기, 갈 곳 막대는 가운데 줄임 (검토 대기)
관리자 지시 (10/18, next e8baa84 캡처에서 찾은 ①~④, 회귀 아님):
① FTP · SFTP · SMB · WebDAV 서버 창: "이름 (탭에 보임, 비우면 주소)" · "시작 폴더 (비우면 …)" · "도메인 · 작업 그룹 (보통 비움)" 이 en 412 에서 잘렸다
  → 칸 이름은 "이름" · "시작 폴더" · "도메인 · 작업 그룹", 설명은 helper (3줄까지).
② 해시 창 비교 칸 → "비교할 해시" + helper "받은 곳에서 알려 준 해시를 붙여넣으세요".
③ 일괄 이름 바꾸기 날짜 고르기: 고른 뒤 상자에는 짧게 ("날짜: 찍은 때" · "날짜: 바뀐 때"), 펼친 목록은 긴 설명 그대로.
④ 한 창 갈 곳 막대: "갈 곳:" 은 늘 보이고 폴더 이름이 길면 가운데를 줄인다 (middleEllipsis · textWidth - path_label.dart). 전체 경로는 길게 눌러 · 마우스를 올려.

확인: integration_test/windows_trunc_shot_test.dart (새, 서버 창 4개 위 · 아래, 412/960 x ko/en/ja) · windows_ftp · windows_p3 · windows_xplore_tools · windows_xplore 캡처 통과
(release\test\shots_trunc), explorer · explorer_webdav · batch_rename · file_tools · ftp · smb · smb_find 시험 통과, analyze 문제 없음, l10n 빠짐 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 04:09:02 +09:00
RyuJongJin 00e9685a33 Merge commit '4ae6845' into next974 2026-10-18 02:32:33 +09:00
RyuJongJin 6434eb85d4 Merge commit '71c995e' into next974 2026-10-18 02:32:15 +09:00
RyuJongJin 4ae6845513 WIP 새 네트워크 기능 보안 고침: 원격 이름 경로 벗어나기 · FTPS 주입 · Wi-Fi 공유는 Wi-Fi · 유선 주소에만 · 찾기 범위 · SMB 강제 DNS (검토 대기)
관리자 지시 2 (10/18, SFTP · SMB · FTP · Wi-Fi 공유 · 스트리밍 다리 · mDNS/훑기 검토) 의 고침:
1 (P0, 로컬 데이터) 악성 · 탈취된 서버가 목록 이름을 "..\..\x" 로 보내면 임시 사본이 앱 임시 폴더 밖에 쓰이고 맞추기 (--delete) 가 위 폴더를 지울 수 있었다
  → vList: 그 폴더 바로 아래의 평범한 이름만 (".." · "." · "\" · NUL · 다른 폴더 버림, 모든 원격 목록이 거침) · DavPath.parse 는 ".." 마디 거부 · vLocalCopy 는 임시 폴더 안인지 확인 (서버에 묻기 전에)
2 FTPS 명시: 234 뒤에 평문으로 끼워 넣은 줄이 있으면 끊는다 (STARTTLS 주입)
3 Wi-Fi 공유: 0.0.0.0 이 아니라 화면에 보이는 Wi-Fi · 유선 · Tailscale 주소에만 따로 연다. 모바일 데이터 (rmnet · ccmni 등 - 통신사 10.x · 100.x) · 가상 어댑터 (WSL · Hyper-V · VirtualBox · VMware · Docker) · 다른 VPN 은 뺀다.
  주소가 없으면 켜지 않고 알림. 캡처에서도 172.24.240.1 (WSL) · 192.168.56.1 (VirtualBox) 이 주소 목록에 보였음.
4 SMB 찾기: Wi-Fi · 유선 연결만 훑는다 (isLanInterfaceName - 3 과 같은 기준)
5 SMB: 서버 이름을 FTP · SFTP 와 같은 DNS 설정 (강제 DNS) 으로 풀어 주소로 넘긴다 (Android 다리의 시스템 DNS 로 새지 않게)
8 FTP: \r · \n · NUL 이 든 명령은 보내지 않는다 (이름으로 명령 끼워 넣기)
11 mDNS: 사설망 주소만 받는다
15 [마스터 초기화] 확인 글에 SFTP · SMB · FTP · SFTP 키도 (실제로 지우는 것과 같게)
같이: Wi-Fi 공유 캡처 시험 (integration_test/windows_wifi_shot_test.dart) - 시험용 주소는 WifiShare.debugAddresses 로 (1차 캡처에서 화면이 다시 그려지지 않아 이 PC 의 실제 망 주소가 찍혔음)

남김 (보고서에): 6 SMB 서명 필수 · 암호화 안 될 때 표시 (Kotlin · 실기기), 7 FTPS 사설 CA 체인의 지문 고정 (사설 CA 서버 시험 필요), 10 Wi-Fi 공유 동기 IO.
괜찮음: 9 원격 임시 사본은 정리 창 "작업 임시 파일" 이 지움, 비밀 값 기록 · 설정 · 백업 · 오류 · 알림 · 경로 복사 없음, 인증서 · 호스트 키 건너뛰기 없음, 다리는 127.0.0.1 · 비밀 주소.

시험: test/net_security_test.dart (새 7) + 전체 902 통과 (17 건너뜀), analyze 문제 없음, l10n 빠짐 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 02:29:58 +09:00
RyuJongJin 71c995ee13 WIP SMB 찾기 화면 캡처 시험 (검토 대기)
integration_test/windows_smbfind_shot_test.dart - [같은 망에서 찾기] · 찾는 중 · 찾은 목록 · 고른 뒤 · 못 찾음, 412/960 x ko/en/ja (가짜 찾기, 실제 망은 훑지 않음).
결과 release	est\shots_smbfind_88379f1 (30장, 6 통과). 412 폭의 주소 안내 잘림은 next 의 17c1ea7 (helperMaxLines 3) 로 고쳐짐.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 02:06:52 +09:00
RyuJongJin e8baa846bb Merge commit 'd29593b' into next
# Conflicts:
#	assets/l10n/en.json
#	assets/l10n/ja.json
#	assets/l10n/zh-Hans.json
2026-10-18 02:02:22 +09:00
RyuJongJin a854299dda Merge commit '752707b' into next
# Conflicts:
#	lib/ui/ftp_settings.dart
2026-10-18 02:02:06 +09:00
RyuJongJin 752707b842 WIP l FTP 캡처 (15): 412 에서 서버 주소 · 시작 폴더 칸의 예시 글이 잘리던 것 - 세 줄까지 (검토 대기)
캡처 시험 integration_test/windows_ftp_shot_test.dart (목록 · 추가 창 · 평문 경고 · 인증서 지문 창, 412/960 × ko/en/ja, release\test\shots_ftp_dd9e93b, 6 통과).
목록의 평문 ⚠ · 처음 값 FTPS · 평문 빨간 경고 · 지문 창은 세 언어 모두 문제 없음. 같은 꼴의 SFTP · SMB 창 예시 글도 잘리지만 이 브랜치에서는 FTP 만 고침.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 01:44:56 +09:00
RyuJongJin 8eb1674382 WIP X-plore P3 보충 (캡처에서 찾음) · 경로 막대 누르기로 위 폴더 고르기 (검토 대기)
캡처 (integration_test/windows_p3_shot_test.dart - 해시 · 비교 · 폴더 속성 · 16진, 412/960 × ko/en/ja, release\test\shots_p3_fix) 에서 찾아 고침:
- 16진 보기: 폭 412 에서 한 줄 16 바이트면 끝의 글자 칸이 화면 밖으로 잘렸다 → 폭 560 미만은 한 줄 8 바이트 (line(per:), 처음 값 16 그대로)
- 해시 창: 닫자마자 글 칸 컨트롤러를 dispose 해 닫히는 동안 "A TextEditingController was used after being disposed" (닫을 때마다) → 닫힌 뒤 dispose
관리자 지시 3 (X-plore 비교표의 작은 것): 위 막대의 경로를 누르면 지금 폴더 · 위 폴더들 (창의 맨 위까지, 가까운 것부터) 이 나와 고르면 그리로 (X-plore 4.4x 경로 막대).
지금 폴더는 고를 수 없게 흐리게.

시험: explorer_test (새: 경로 막대 - 지금 폴더 못 고름 · 바로 위 = left · 고르면 하나 적어짐) · file_tools_test 통과, analyze 문제 없음, l10n 빠짐 0, 캡처 시험 6 통과.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 01:43:17 +09:00
RyuJongJin 49990c4120 Merge branch 'secret_test' into next 2026-10-18 01:02:29 +09:00
RyuJongJin 60398d22e8 WIP X-plore P3: 저장 공간 분석에 [칸 그림] (treemap, 87 위) (검토 대기)
- 저장 공간 분석 화면에 세 번째 보기 [칸 그림]: 지금 폴더 안을 크기만큼의 칸으로 (squarified treemap).
  큰 폴더 30개는 따로, 나머지 폴더는 한 칸, 이 폴더 바로 안의 파일도 한 칸 (회색, 누를 수 없음). 칸 = 이름 · 크기 · %.
  폴더 칸을 누르면 그 안으로 (← 로 위로, [그 자리로] 는 예전 그대로). 지우기는 여기서 하지 않음 (87 결정 그대로).
- 시험: storage_chart_test (넓이 비례 · 겹치지 않음 · 누르기).
- 캡처: integration_test/windows_xplore_tools_shot_test.dart → release\test\shots_xplore_tools
  (격자 · 글 뷰어 · 일괄 이름 날짜 · 칸 그림, ko/en × 412/960).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 00:55:29 +09:00
RyuJongJin a80d8bcafe WIP X-plore f: 압축 (ZIP · 7z · RAR) 을 트리 안에서 폴더처럼 펼치기 · 읽기 전용 (검토 대기)
- 압축 파일의 › 로 펼치면 안의 폴더 · 파일이 트리에 (목록에 폴더 이름이 없어도 경로에서 폴더를 만든다).
  안의 파일을 열면 그 파일만 임시 폴더 (jj_arcview) 로 꺼내 연다 (보기 · 재생).
- 읽기 전용 (관리자 지시): 압축 안의 이름 바꾸기 · 일괄 이름 · 지우기 · 이동은 막고 알림. 압축 안으로 붙여넣기 · 놓기 · 새 폴더도 막음.
  압축 안의 것을 복사 · 붙여넣기 · 끌어 놓으면 86 의 풀기 창 (위험한 경로 · 링크 검사 · 같은 이름 · 갈 곳) 으로 꺼낸다.
- 비밀번호가 걸린 압축 · 파일은 미리 보지 않고 [압축 풀기] 로 안내 (비밀번호를 명령 줄 · 기록에 남기지 않는 86 흐름 그대로).
- 7z · RAR 은 동봉 7-Zip 이 있을 때만 (없으면 알림). WebDAV · SFTP 위의 압축과 Rsync 화면은 펼치지 않음.
- 내 판단: 압축 안 폴더를 펼쳐 지금 폴더가 압축 안이 되면 [새 폴더] · 붙여넣기를 막는다 (캡처에서 발견).
- 알려진 한계: 펼친 뒤 압축 파일이 바뀌면 다시 펼칠 때까지 예전 목록.
- 시험: explorer_test "X-plore f", 캡처 release\test\shots_xplore_f (archive_ko/en_412/960).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 00:42:08 +09:00
RyuJongJin f4760cb4d7 WIP X-plore e: Android 앱 휴지통 · 85 진행 패널 시험 흔들림 · X-plore 캡처 시험 (검토 대기)
- e (관리자 지시): Android 는 저장 장치마다 .jj_trash 에 보관 (처음 14일, 설정 0 = 끔 - 예전처럼 바로 영구 삭제).
  지우기 = 휴지통으로 · [되돌리기] 알림 · 휴지통 화면 (되살리기 · 영구 삭제 · 비우기), 켤 때 기한 지난 것 정리.
  휴지통으로 못 옮긴 것은 영구 삭제할지 따로 묻는다 (몰래 영구 삭제하지 않음). Windows 의 [휴지통] 버튼은 시스템 휴지통을 연다.
- 내 판단: 한 창 "갈 곳" 줄은 전체 경로 대신 폴더 이름 (좁은 화면에서 잘림).
- 85 시험 흔들림 (관리자 지시): pumpAndSettle 대신 조건 기다리기 · 칩 onTap 직접 (3번 연속 통과).
- integration_test/windows_xplore_shot_test.dart: X-plore P1 화면 캡처 (ko/en × 412/960).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 00:28:06 +09:00
RyuJongJin 00fac175b9 WIP 시험: 안전 저장소 (DPAPI) 시험이 사용자 secrets.dat 를 건드리지 않게 - 임시 폴더로, 보통 회귀에 넣음 (검토 대기)
관리자 지시 (10/17): integration_test/secret_store_platform_test 는 Windows 에서 사용자의 앱 데이터 폴더
(%APPDATA%\com.jj\jj_mkvmaker\secrets.dat) 에 시험 열쇠를 쓰고 지웠다 (값은 지웠지만 파일을 다시 쓰고, 그동안 다른 실행과 겹칠 수 있음).
- SecretStore.dpapiAt(dir) (@visibleForTesting): DPAPI 저장소를 정한 폴더의 secrets.dat 로. 앱 동작은 그대로 (platform() 은 앱 데이터 폴더)
- test/secret_store_dpapi_test.dart (새, 보통 flutter test 에서 돎 - DPAPI 는 FFI 라 플러그인 없이 됨):
  쓰기 · 읽기 · 바꾸기 · 지우기 · 파일에 평문 없음 · .tmp 안 남음, 130 두 창 번갈아 쓰기, 풀 수 없는 파일은 보관 뒤 새로 시작 (40-5).
  끝날 때마다 사용자 secrets.dat 의 바뀐 때 · 크기가 그대로인지 확인
- integration_test 의 같은 시험: Windows 는 임시 폴더 저장소로, Android 는 기기 Keystore 그대로 (시험 열쇠만 쓰고 지움)

시험: secret_store_dpapi 3 · secret_store · secret_issue 15 통과, analyze 문제 없음, 사용자 secrets.dat 생기지 않음 · jj_secret* 흔적 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 23:43:41 +09:00
RyuJongJin cd50edd666 WIP Windows 통합 시험 회귀 (지시 10): 바뀐 동작 · 바깥 주소에 맞게 시험 3곳 고침 (검토 대기)
ab4d935 에서 integration_test 전부를 하나씩 -d windows 로 돌려 찾은 것 (앱 동작은 바꾸지 않음):
- browser_real: 137 뒤 [다운로드] 는 동영상을 찾은 페이지만 꽉 찬 버튼 (못 찾으면 테두리만) - 시험이 꽉 찬 버튼만 찾다 실패.
- tor_dns_real: 파일 링크 시험 주소 (dist.torproject.org 15.0.24 .asc) 가 404 (예전 판을 지움) → 오래 남는 archive 의 같은 파일.
- windows_check_shot 37: 서버만 (\NAS) · 없는 폴더는 창을 닫지 않고 칸 아래 알림 (146 · 37-2) - 시험이 창을 닫지 않아
  다음 입력 · 다음 크기에서 남은 창이 가렸다 → [취소] 로 닫고 다음으로.
(그 밖의 실패 6개는 회귀를 돌린 내 스크립트가 캡처 폴더를 미리 만들지 않은 탓 - 만든 뒤 모두 통과)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 18:00:19 +09:00
RyuJongJin a223a10378 WIP Windows 통합 시험 (지시 9): 82 끌어 놓기 · 75 마우스 4 · 5 번을 실제 빌드에서 가짜 포인터로 (검토 대기)
integration_test/windows_b6_input_test.dart (flutter test ... -d windows, 실제 마우스 · 키보드는 쓰지 않음):
- 82: 6px 는 끌기 아님 (끄는 그림 · 묻기 없음), 12px 부터 끌기. 같은 창 위 = 빨간 테두리, 다른 창의 폴더 줄 = 그 줄 강조,
  다른 창의 파일 줄 = 창 전체 강조. 놓으면 묻기 창 (처음 고른 것 [복사]) → [이동] → 확인 → [되돌리기] 로 원래 자리.
- 75: 마우스가 올라간 창의 4 번 (뒤로) · 5 번 (앞으로), 다른 창이 활성이어도 그 창만. Alt+← / → 는 활성 창. 왼쪽 단추는 이동 아님.
두 번 돌려 모두 통과.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 16:33:06 +09:00
RyuJongJin 0f3133cc68 WIP 15 캡처 지적 ①~④: 영어 단수 · 좁은 화면 풀 곳 세로 목록 · 찾기/분석 줄은 시작한 폴더 기준 짧은 경로 · 캡처 DEBUG 띠 끔 (검토 대기)
관리자 지시 (15 캡처 지적, 버그 수정):
① 영어 "1 problems" · "1 names": englishSingular (61) 에 problems · names · paths 를 더하고,
   수와 명사 사이 꾸미는 말 하나도 넘게 ("1 incomplete files" → "1 incomplete file"). 78 영어 글 "until fixed".
② 86 풀 곳: 폭 720 미만이면 칩 대신 세로 라디오 목록 (글이 다 보임). ZIP 묶기의 넣을 곳도 같은 도우미.
③ 79 찾기 결과 · 87 큰 파일 줄: 시작한 폴더 이름부터의 상대 경로 (shortUnder), 길면 가운데 줄임 (앞 … 마지막 두 단계),
   전체 경로는 마우스를 올리거나 그 줄을 길게 누르면 (Tooltip).
④ 캡처 시험 debugShowCheckedModeBanner: false.

내 판단: ① 은 개수별 글을 따로 두지 않고 기존 61 의 단수 처리를 넓힘 (같은 꼴의 다른 글도 함께 고쳐짐).
② 를 ZIP 묶기 창에도 적용 (같은 모양).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:57:25 +09:00
RyuJongJin 3b6d50f409 WIP 시험: 묶음6 화면 캡처 (Windows 통합 시험, 412 · 960 × ko · en · ja) + 85 작은 표시를 TransferProgressChip 으로 (검토 대기)
- 관리자 지시 5: 기기 없이 15 가 볼 수 있게 integration_test/windows_b6_shot_test.dart (JJ_SHOT_DIR 에 PNG):
  78 이름 일괄 창 (겹침 빨간 줄) · 79 찾기 결과 (고른 줄 · 아래 할 일 줄) · 81 빠른 보기 (자막 글) · 82 놓기 묻기 창 ·
  85 작은 표시 (보통 · 멈춤) · 86 풀기 확인 창 (밖으로 나가는 경로 · 링크 · 쓸 수 없는 이름 · 덮어쓰기 경고) · 87 분석 (큰 폴더 · 큰 파일).
  시험 파일은 임시 폴더에만 (끝나면 지움), 설정은 메모리에만.
- 85 의 작은 표시를 공개 위젯 TransferProgressChip 으로 뺐다 (모양 · 동작 같음) - 멈춤 상태를 실제 실패 없이 캡처하려고.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:19:46 +09:00
RyuJongJin 0b0f2617ae 250 고침: 덮개를 띄우면 웹 뷰가 새로 만들어져 덮개가 바로 걷히던 것 · 엔진의 본문 오류로도 판단
a4 의 931 기기 확인 (노트 10+): DNS 192.0.2.1 에서 브라우저에 덮개가 보이지 않고 ERR_TUNNEL_CONNECTION_FAILED 만 (버그 수정).
- 원인: 덮개가 없을 때는 웹 뷰를, 있을 때는 Stack 안의 웹 뷰를 돌려 트리 모양이 바뀌었다 → 웹 뷰가 새로 만들어져
  페이지를 다시 읽고, 다시 읽기 시작에서 덮개가 걷혔다. Windows 실제 Edge 통합 시험에서 재현
  ("WindowsInAppWebViewController was used after being disposed"). 늘 같은 Stack 모양으로.
- 엔진이 알려 주는 본문 오류 (onReceivedError, Edge · Android) 도 받아 판단한다: 그 이름의 실패 기록이 있거나,
  DNS 서버에 지금 닿지 않는 중에 프록시 터널 실패 (TUNNEL · PROXY) 면 덮개. 오류 뒤에 오는 읽기 끝이 덮개를 지우지 않는다.
  DNS 강제 중의 본문 오류는 작업 기록에 남긴다 (기기에서 원인을 볼 수 있게).
- 시험: 덮개를 띄워도 웹 뷰를 다시 만들지 않음 · 본문 오류 경로 · DNS 와 상관없는 오류는 엔진 화면 그대로.
  실제 Edge: integration_test/dns_block_real_test.dart (덮개 → [다시 시도] → 다시 덮개) 통과.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 06:59:07 +09:00
RyuJongJin 620cd63e34 Chrome 엔진: 관리자 권한이면 시작 안 함 (설정으로 허용) · 20초 안전망 · 인증 없는 숨긴 문 (207) · DNS 강제를 앱 시작 맨 앞에
- 207 원인: Chromium 은 관리자 권한으로 실행되면 권한을 낮춰 다시 띄우려고 스스로 끝난다 (CefInitialize false, 종료 코드 38).
  관리자 판단 (보안 우선): 관리자 권한이면 Chrome 엔진을 시작하지 않고 이유 · [Edge 엔진으로 바꾸기] · [그래도 Chrome 엔진 쓰기…] (경고 확인).
  환경 설정 > 브라우저 "관리자 권한일 때도 Chrome 엔진 쓰기 (권장하지 않음)" (처음 꺼짐) 를 켜면 --do-not-de-elevate (webview_cef 패치 7).
- 20초 안에 준비되지 않으면 "Chrome 엔진을 시작하지 못했습니다" · [Edge 엔진으로 바꾸기] · [다시 시도]. 시작 중에 닫을 때의 LateInitializationError 고침.
- Chrome 엔진은 프록시 인증에 답하지 않아 (CEF 149 windowless 에서 GetAuthCredentials 가 불리지 않음, 확인) 인증 없는 문을
  실행마다 고른 127.x.y.z 의 빈 포트에, Chrome 엔진 웹 뷰가 있는 동안만 연다 (관리자 결정). 듣지 않던 옛 인증 패치는 걷어냄.
- DNS 강제: HttpOverrides 를 main · runAndroid · runSecondWindow 맨 앞에서 건다. 그 전에 만들어 두던 HttpClient
  (새 버전 확인 · 구성 요소 · 도구 받기 · 자막 검색) 가 정한 DNS 를 거치지 않고 시스템 DNS 로 나가던 것 (닿지 않는 DNS 시험판에서 발견).
- 안내 문구: DNS 서버에 닿지 않음은 예외 원문 대신 무엇을 확인할지, Tor 연결이 2분 넘게 멈추면 몇 % 에서 멈췄는지와 [다시 시도].
- 시험: cef_elevation_test (4), dns_proxy_test (Chrome 엔진 문 · 일찍 만든 HttpClient 도 정한 DNS).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 00:23:20 +09:00
RyuJongJin 697235073e Tor · DNS 보완: 앱 안 프록시 인증 · Android 웹 뷰 문 · Tor 화면 떠남 정리 · 다운로드 막기
관리자 결정 (10/11) · 기기 확인 (노트 10+, 911 시험판 1~6 통과) 에 따라 0d1ea93 을 보완.
- 앱 안 프록시 (DNS 강제 · Tor 다리) 인증: 실행마다 새 무작위 비밀값 (저장 안 함) 으로 Basic Proxy-Authorization, 틀리면 407.
  HttpClient (findProxy) · yt-dlp (--proxy) · aria2 (--all-proxy-user/passwd) · Edge (WebView2 BasicAuthenticationRequested) ·
  Chrome 엔진 (webview_cef 패치 7, GetAuthCredentials) 이 이 프록시에만 답한다. 127.0.0.1 에만 묶음.
- Android 웹 뷰는 프록시 인증에 답하지 못해 (기기 확인) 인증 없는 "문" 을 따로: 실행마다 고른 127.x.y.z 의 빈 포트,
  웹 뷰 화면 (일반 브라우저 · Tor 화면) 이 맨 앞에 보이고 앱이 앞일 때만 연다 (그 밖엔 닫힌 포트 127.0.0.1:9).
  "다른 화면으로 가면 소리 멈춤" 을 끈 사용자는 일반 브라우저가 살아 있는 동안 DNS 문 유지 (사용자 설정을 따름). Tor 문은 따로.
- Tor 화면을 떠나면 (다른 화면 · 앱이 뒤로) 바로 웹 뷰 · 쿠키 정리, 프록시 · 다리 되돌림. tor 는 설정 시간 (처음 2분, 0 = 바로) 뒤 끔.
  남은 Tor 웹 뷰가 있는 동안은 Tor 문 · 닫힌 포트만 건다 (앱이 뒤에 있어 화면을 그리지 않아도 일반 쪽으로 나가지 않게).
- Tor 화면 파일 링크는 받지 않고 안내 (Windows: flutter_inappwebview_windows 0.6.0 사본에 DownloadStarting, JJ_PATCH.md · 고지).
- 시험: web_proxy_gate_test (새), tor_test · dns_proxy_test 보강, integration_test tor_dns_real_test 보강 · cef_dns_real_test (새, 207 확인용).
- analysis_options: packages/flutter_inappwebview_windows 를 분석에서 뺌 (다른 고친 외부 부품과 같게).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 22:36:32 +09:00
RyuJongJin 0d1ea93fd3 Tor 브라우저 (컴포넌트) · DNS 강제 (기본 8.8.8.8 / 8.8.4.4)
사용자 요청 (10/10): "Tor 브라우저를 현재 브라우저 옆에 추가 · 설정에서 컴포넌트처럼 추가 ·
DNS 주소를 강제로 내가 설정한 주소로, 기본 8.8.8.8" (보조 8.8.4.4 는 관리자 결정).

DNS 강제 (환경 설정 > 네트워크 · DNS: 시스템 DNS (끄기) / 직접 지정 (기본) / DNS over HTTPS)
- 앱 안 HTTP 프록시 (127.0.0.1, CONNECT + http) 가 정한 서버로 이름을 푼다 (UDP, 잘리면 TCP, DoH,
  TTL 동안 기억). 닿지 않으면 기기 DNS 로 몰래 바꾸지 않고 502 + 알림 [시스템 DNS 로 바꾸기].
- 따르는 것: 앱의 HttpClient (HttpOverrides: 업데이트 · 컴포넌트 · AI 모델 · WebDAV · 번역 · 자막),
  Edge (--proxy-server) · Chrome 엔진 (webview_cef 패치 6), Android 웹 뷰 (ProxyController),
  yt-dlp --proxy, aria2 --all-proxy (+ c-ares 가 있으면 --async-dns-server).
- IP 주소 · 같은 집 안 이름 (점 없는 이름, *.local, Tailscale *.ts.net 등) 은 기기 DNS (내 판단: NAS · WebDAV 가 그대로 열리게).

Tor 브라우저 (컴포넌트 'tor', 처음 꺼짐, 화면은 웹 브라우저 바로 뒤)
- Windows: 공식 Tor Expert Bundle 15.0.24 (tor 0.4.9.13) 을 받아 SHA-256 확인
  (e9dc6ccc…2b65) → 앱 데이터 components/tor. Android: 같은 판의 libTor.so 를 APK 에 (tool/fetch_tor_android.ps1).
- tor 를 자식 프로세스로 (SOCKS · 제어 포트는 빈 포트, 쿠키 인증, __OwningControllerProcess), Tor 화면을 닫으면 끔.
- 웹 뷰 → Tor 다리 (HTTP 프록시 → SOCKS5, 이름은 Tor 에 넘김). Tor 100% · 프록시 적용 · 전용 프로필이
  모두 된 뒤에만 웹 뷰를 만든다. WebRTC 끔, 권한 거절, 검색은 DuckDuckGo.
- Windows: 따로 WebView2 환경 (tor_webview, InPrivate). Android: 웹 뷰 프록시가 앱 전체라 Tor 화면이
  열려 있는 동안 일반 브라우저도 Tor (안내 띠, 관리자 결정), androidx.webkit 프로필 'jj_tor'
  (flutter_inappwebview_android 패치 jjProfile). 기능이 없으면 화면을 열지 않음.
- 상태 줄 (연결 중 % / 연결됨 / 실패 + 다시 시도), [새 경로] (NEWNYM), 처음 열 때 "공식 Tor Browser 아님" 안내.
- 라이선스: TOR_LICENSES.txt (Tor BSD-3 · Libevent · OpenSSL · zlib · zstd), tor 실행 파일은 GPL 빌드 → GPL-3.0.

시험: dns_proxy_test (가짜 DNS · 프록시 · SOCKS 다리), tor_test (새는 것 막기 · 번들 해시 · torrc),
integration_test/tor_dns_real_test (Windows 실제: 8.8.8.8 로 풀기, 닿지 않는 DNS 는 실패,
check.torproject.org "Congratulations").

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:10:17 +09:00
RyuJongJin 3a220ab073 [MKV 만들기] 와 AI 버튼 구별 · AI 작업 전에 계획 보이기 (138)
[MKV 만들기] 와 [자막 만들기 & MKV 만들기] 를 헷갈려 오래 걸리는 AI 자막이 돌던 것.
- AI 버튼 (자막 만들기 · 자막 & MKV) 은 보라 테두리 · 글자 · ✨ 아이콘, [MKV 만들기] 는 청록 채움 · ▶.
  좁은 화면에서는 AI 버튼을 맨 뒤 구분선 너머로 (넓은 화면은 왼쪽 · 오른쪽으로 원래 떨어져 있음).
- AI 설정 창 맨 위에 계획: 할 일 · 대상 수 · 자막 언어 · 예상 시간 (영상 1시간 ≈ 음성인식 15~30분 + 번역 언어마다 10~20분).
- 환경 설정에서 "매번 묻기" 를 끈 경우는 사용자 설정대로 묻지 않되, 3초 알림
  "AI 자막 (동영상 n개 · 약 m분) 을 시작합니다 [취소]" 뒤에 시작해 잘못 누른 것을 되돌릴 수 있게.
- ai_confirm_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:12:14 +09:00
RyuJongJin 26f6389f02 MKV 화면 맨 위 줄: 다른 언어에서 버튼 글이 잘리던 것 (61)
줄이기 순서 (제목 → 버튼 글 → …) 를 정할 때 버튼 너비를 한국어 글로 잰 고정 값으로 셈해, 글이 긴 일본어
("字幕作成 & MKV 作成") 에서는 줄이기 전에 잘렸다 (S10 Ultra 가로). 지금 언어의 글 너비를 재어 차이를 더한다
(한국어는 그대로). 캡처 시험: 실제 서비스로 일본어 1644 · 1480 · 1280 · 1138 · 960, 체크 0 · 50개.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:41:14 +09:00
RyuJongJin f429c59502 다국어 작은 것들 (61)
- 영어 복수형: 영어 글에서 수가 1 이면 단수 ("1 videos" → "1 video"). 11 · 21 · 1.5 는 그대로.
- 탐색기 복사 · 이동 확인: 문장 조각 + "복사할까요?" 를 잇던 것을 두 문장으로 (언어마다 어순이 깨졌음).
- MKV 기본 자막 트랙 · 플레이어가 먼저 켜는 자막: 늘 한국어 → 화면 언어 (목록에 없는 언어면 한국어).
- robocopy 진행: 종류 글 ("New File" 등) 이 아니라 탭 모양으로 파일 줄을 알아봐 일본어 · 중국어 Windows 에서도.
- Android 저장소 이름: 내장 · SD 카드는 앱 화면 언어로 (Kotlin 이 isPrimary 를 넘김), USB 등은 기기 이름 그대로.
- 기본 즐겨찾기 ("YouTube 구독" · 표시줄 · 기타): 한국어 열쇠로 저장하고 이름을 바꾸지 않았으면 화면 언어로
  (예전 판이 다른 언어로 저장한 기본 이름 포함). 바꾼 이름 · 사용자 항목은 그대로.
- i18n_small_test · sync_tools_test (일본어 · 중국어 robocopy 줄), 캡처 시험에 일본어 가로 첫 화면.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:29:58 +09:00
RyuJongJin f33a4b3547 휴지통 시험: 기본은 가짜 휴지통, 실제 휴지통은 JJ_TEST_REAL_RECYCLE=1 일 때만
전체 시험 도중에 끊기면 사용자 휴지통에 시험 흔적이 남았다 (10/10 01:31).
- 탐색기는 recycle() · restoreRecycled() 를 쓴다 (앱은 늘 실제 휴지통, 시험만 recycleBinForTest 로 바꿈).
- test/support/fake_recycle_bin.dart: 실제와 같은 규칙 (긴 경로 거부 · 되돌릴 때 덮지 않음 · 원래 폴더 없으면 안 만듦),
  다른 드라이브면 복사 후 지움. useTestRecycleBin() 은 JJ_TEST_REAL_RECYCLE=1 이 아니면 가짜로.
- recycle_bin_test 의 실제 휴지통 시험 3개와 긴 경로의 실제 함수 부르기는 실제 모드에서만.
  explorer_conflict · explorer · 캡처 시험 (b3 · check) 은 기본 가짜.
- windows_check_shot_test 의 "65 · 94 · 98" 은 144 뒤로 깨져 있었다 ([그대로 두기] 창을 닫지 않아 다음 크기에서 막힘) - 닫게 고침.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:11:38 +09:00
RyuJongJin 4c0bc0b9ce Flutter 기본 글을 화면 언어로 (140 · 158): 뒤로 · 라이선스 화면 · 복사 · 붙여넣기 메뉴 등
- flutter_localizations 를 더하고 MaterialApp 이 화면 언어 (i18n) 를 바꿀 때만 다시 그려진다.
- Flutter 가 아는 언어면 그 언어 (앱이 더한 기계 번역 언어 포함, 예 de · vi), 모르는 언어일 때만 영어. 한국어가 섞이지 않는다.
- supportedLocales 는 kMaterialSupportedLanguages 전체 + 지금 언어 (zh-Hant · pt-BR 처럼 글자 체계 · 나라까지 그대로).
- Material 만 알고 Cupertino 는 모르는 언어 (ps) 는 Cupertino 글만 영어로 채운다.
- 시험: locale_test (de → Zurück, 없는 언어 → Back, zh-Hant 유지, ps 열림).
- Windows 캡처 시험 (windows_i18n_shot_test): 라이선스 목록을 다 읽은 뒤까지 찍는다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:54:24 +09:00
RyuJongJin de967d190a 49 탐색기 뒤로 키: 먼저 고른 것 풀기 → 상위 폴더 → 맨 위에서 화면 닫기 (위쪽 ← 는 늘 닫기)
- 탐색기 · Rsync 화면에 PopScope: 시스템 뒤로 (Android 뒤로 키 · 몸짓 · 마우스 뒤로 · Esc) 만 차례를 거친다
- 위쪽 ← 는 브라우저처럼 늘 바로 닫기 (Navigator.pop)
- 시험: 선택 → 뒤로 (풀기) → 뒤로 (상위) → 뒤로 (닫기). 66-2 캡처 시험 (integration_test/windows_662_shot_test) 도 함께

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:29:03 +09:00
RyuJongJin 01600ec69a 66-2 화면 옮기기: 지금 화면 아이콘 파랗게 · 민 쪽으로 미끄러지는 전환 · 처음으로 / 끝 알림 · 브라우저 안내 한 줄 (한 번)
- 지금 화면 아이콘: 넓은 화면도 파란 글자 + 옅은 바탕 (좁은 화면은 바탕 더함)
- 좌우로 밀기 · 이전 · 다음으로 옮길 때만 민 쪽에서 미끄러져 들어옴 (NavSlideTransitionsBuilder, 그 밖은 기본 전환)
- 끝에서 처음으로 넘어가면 "처음으로: …", 처음에서 끝이면 "마지막으로: …", 돌기를 끈 채 끝이면 "마지막 화면입니다" / "첫 화면입니다"
- 웹 브라우저 처음 열 때 위쪽 막대 아래 한 줄 안내 (✕ 로 닫음, browserSwipeHinted) - 알림이면 다른 알림을 뒤로 밀어서 한 줄로
- 캡처 시험: 154 · 155 를 새 화면에서 알림을 지운 뒤 찍음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:16:08 +09:00
RyuJongJin 1450b51316 묶음 3 Windows 확인 캡처 · 휴지통 시험 흔적 스스로 확인 · 꺼내는 드라이브가 비면 "비어 있음"
- integration_test/windows_b3_shot_test: 165 · 48 · 154 · 52 · 148 · 144 를 실제 화면으로 눌러 PNG (JJ_SHOT_DIR)
- 휴지통을 건드리는 시험은 끝에 사용자 휴지통 전체에서 시험 폴더 아래 (하위 포함) 가 원래 위치인 항목이 0 인지 확인
  (test/support/recycle_leftovers.dart)
- 165 보충: 카드 리더 · USB · CD (GetDriveType 2 · 5) 가 열리지 않으면 "연결 안 됨" 이 아니라 "비어 있음" (회색)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:55:29 +09:00
RyuJongJin 7d6c653d5f AI 그림 1차 (123) · WebDAV 안내 (133 · 134 · 142 · 143) · 긴 경로 휴지통 보호 · AI 화면 작은 것 (139 · 140 · 141)
- 123: 기기 안 그림 만들기 (stable-diffusion.cpp 228c707, SD1.5 + LCM-LoRA + TAESD)
  · 공식 배포처 · SHA-256 고정, OpenRAIL-M 용도 제한을 보이고 동의 뒤 받기, 공간 확인
  · Windows 실행 파일은 받음 (Vulkan, NVIDIA 면 CUDA 12), Android 는 APK 에 libsdcli.so (tool/build_sdcpp_android.sh)
  · 처리 장치 자동 (짧게 재서 가장 빠른 것), 진행 · 남은 장 · 예상 시간 · 취소, 작업 알림 · 작업 현황
  · 글 → 그림 · 그림 → 그림, 결과는 새 PNG + json (프롬프트 · 시드 · 모델), 보기 화면의 [AI 그림으로]
  · 사용자가 추가하는 서버 · 서비스 (Automatic1111 · ComfyUI · OpenAI 형식), 기기 밖으로 나간다고 늘 알림, API 키는 안전 저장소
  · 컴포넌트 "AI 그림" · 환경 설정 > AI 그림 · 라이선스 고지
- 133 · 134 · 142: WebDAV 를 읽는 곳에서 마스터로 막히면 [마스터 비밀번호 넣기], 서버에 닿지 않으면 알아볼 수 있는 말
- 143: WebDAV 서버 고치기 창에서도 지우기
- 긴 경로 (260자 넘음) 는 휴지통이 받지 않아 Windows 가 묻지 않고 영구 삭제하던 것 - 보내기 전에 막고 이유를 알림
- 139 · 140 · 141: 받을 크기 한 값으로 · 뒤로 버튼 이름 · 시드 칸 이름, 바탕 그림 작은 그림
- Windows 확인용 화면 캡처 시험 (integration_test/windows_check_shot_test.dart)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:35:57 +09:00
RyuJongJin 70056b0db3 보안 · 비밀번호 (124 · 127~132) · 쿠키 (53) · http 경고 (56) · 안내 고침 (116 · 125 · 126) · 시험 안정화
- 124: 최상 · 마스터 비밀번호 (솔트 PBKDF2-HMAC-SHA256, 안전 저장소에 해시만), 묻는 때 (안전 저장소),
  저장된 비밀번호를 쓰는 곳의 문 (WebDAV · OpenSubtitles · 재생 · 환경 설정), 최상으로 초기화 · 잊었을 때 초기화,
  틀리면 기다리기, 서버 지우기 전 쓰는 곳 알림, 실시간 동기화 폴더에 WebDAV 고르기
- 127: 서버 고치기 창은 마스터 뒤에 (저장된 비밀번호가 보이지 않게)
- 128: 마스터 창은 하나로 · 취소하면 배경 작업은 묻지 않고 "기다리는 중" 으로 표시
- 129: 묻는 때를 설정 파일이 아니라 안전 저장소에 (값이 없거나 틀리면 쓸 때 묻기)
- 130: Windows secrets.dat 를 쓰기 · 지우기 전에 다시 읽어 다른 창의 값과 합침
- 131: 앱 안 브라우저 쿠키를 쓰지 않게 바꾸면 내보낸 쿠키 파일을 지움
- 132: 최상 비밀번호 [끄기] 가 넓은 화면에서 잘리지 않게
- 53: 쿠키 파일 안내 · 넘길 사이트 고르기 · 쿠키 · 방문 기록 지우기 · 범위 넓힘 알림
- 56: http:// WebDAV 경고 · 인증서 확인 끄기가 다른 재생에 남지 않게
- 116 · 125 · 126: 권한 안내 다시 · "2-1 / 3장" · 바뀐 기본 설정 창을 닫으면 바로 저장
- 시험판 데이터 폴더 (JJ_MKVMAKER_DATA, Windows) · 휴지통 판정을 $I 정보로 · 모니터링 시험 기다림

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:22:47 +09:00
RyuJongJin 597d853943 비밀번호 안전 저장 · 동기화 안전장치 · 휴지통 · 시작 메뉴 알림 · 보기 화면 (계속 보기 · 두 쪽 · 회전) · 탐색기 배치 등
- 40/54: WebDAV · OpenSubtitles 비밀번호를 안전 저장소 (Android Keystore · Windows DPAPI) 로
- 95~114: rsync 지우기 확인 · 미리 보기 · 좁은 화면 확인 창 · 실시간 동기화 멈춤 알림
- 99: 시작 메뉴 바로 가기 (AUMID) · jjmkvmaker:// · Windows 알림 꺼짐 안내
- 102: 질문을 설정으로 · 시스템 언어 따르기
- 113 · 117~120: 보기 화면 막대 · 계속 보기 · 두 쪽 나눠 보기 · 회전 · 반전 · 좁으면 ⋮ 메뉴
- 115 · 116: 자동 백업 복원 알림 · 권한 안내와 자동 다시 분석
- 118 · 122: 탐색기 좌우 ⇆ / 위아래 ⇅ 버튼 · 경로로 가면 새로 읽어 펼침

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 10:25:08 +09:00
RyuJongJin ac8fd8ad9a 이미지 · PDF · ZIP 보기 (컴포넌트 "viewer")
- reader_page: 그림 · 만화 · PDF 보기. 오른쪽 1/3 누르면 다음, 왼쪽은 이전, 가운데는 막대 보이기 · 숨기기,
  좌우로 밀어도 넘김. 한 쪽 맞추기 · 좌우 맞추기, 넘기는 방향 (오른쪽→왼쪽 만화), 어둡게 · 밝게, 쪽 막대.
- 그림: 탐색기의 지금 정렬 순서대로 같은 폴더 그림을 넘김. 대상 확장자는 환경 설정 > 파일 탐색기에서 고름.
- PDF (pdfrx): 보기, 페이지 지우기, 그림을 페이지로 넣기, 저장 (빈 새 문서에 보이는 순서대로 조립 -
  원본 문서 페이지 목록을 바꾸면 pdfrx 가 엉뚱한 페이지를 남겼음). 원본은 사본으로 열어 덮어쓰기 가능하게.
- 그림 → PDF: 탐색기 메뉴 "PDF 로 만들기" (표시한 그림들을 한 장씩).
- ZIP · CBZ: 목록 · 골라서 / 모두 풀기 (다른 창 · 새 폴더 · 같은 폴더), 만화 보기 (설정에서 바로 보기 켜기 · 끄기).
- 탐색기 메뉴 "보기", WebDAV 파일도 (받아서).
- 시험: reader_test (ZIP · 넘기기 · 설정), integration_test/pdf_test (실제 pdfium).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 15:24:47 +09:00
RyuJongJin 44ae09a31f 플레이어: 건너뛴 뒤 다음 편으로 넘어가던 것 · 지운 WebDAV 서버를 보던 창
- mpv keep-open=always: 파일 끝에서 mpv 가 스스로 다음 파일로 넘어가지 않게 하고 앱이 정한다.
  건너뛴 직후 (3초 안, 끝 5초 전보다 앞) 의 "끝" 은 잘못 본 것 → 그 곳으로 키프레임 기준 다시 건너뜀.
  진짜 끝이면 다음 파일로 넘어가 계속 재생.
- 탐색기: 설정에서 지운 WebDAV 서버를 보던 창은 이 기기의 첫 저장 장치로.
- integration_test/seek_repro_test.dart (JJ_SEEK_FILE 일 때): 여러 곳 건너뛰기 · 진짜 끝에서 다음 파일.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:42:47 +09:00
RyuJongJin 1ac48354af rsync 원본 파일 지우기 (--remove-source-files) · 빈 폴더 정리 · lsync 최종 정리
- Rsync 화면의 한 방향 (좌 → 우 · 좌 ← 우): 확인 창에서 [원본 파일 지우기 (--remove-source-files)] 를 고를 수 있고,
  고르면 끝난 뒤 원본의 빈 폴더를 지움 (find 원본/ -type d -empty -delete) - 원본 폴더는 남김 / 지움 중 고르기.
  양쪽 (⇄) 에는 없음
- 모니터링 lsync 의 쌍마다 [최종 정리]: rsync -avHPOg --remove-source-files 원본/ 대상/ 뒤 빈 폴더 지우기,
  원본 폴더 남김 / 지움 고르기. 원본이 비므로 그 실시간 동기화는 끔 (지우기 포함이면 대상까지 비우지 않게),
  진행은 복사 · rsync 탭에 남음
- 기억한 작업에 원본 정리 (prune) 저장, 모니터링 카드에서 바꾸기 · 진행 막대에 "빈 폴더 N개 지움"
- 원본 정리를 고른 이동은 예전의 "비면 원본 폴더째 지우기" 대신 고른 대로
- Windows 실제 rsync 로 시험 (integration_test/rsync_page_test.dart)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 21:47:20 +09:00
RyuJongJin c273297b11 Rsync 화면 (파일 탐색기 옆) · 파일 탐색기에서 모니터링 · rsync · lsync 빼기
- 위쪽 파일 탐색기 옆 [Rsync]: 파일 탐색기와 같은 모양, 늘 좌우 두 창 · 폴더만 · 창마다 폴더 하나만 고르기
- 가운데 좌 → 우 (왼쪽 → 오른쪽) · 좌 ← 우 (오른쪽 → 왼쪽) · 좌 ⇄ 우 (둘 다 함께, -u 로 받는 쪽의 새 파일은 덮어쓰지 않음)
  폴더 안의 것을 맞춤 (원본/ → 대상/), 확인 창에 경로 · 옵션, 진행 막대는 방향마다
- 가운데 [모니터링]: 실행한 rsync 가 남아 옵션 고치기 · 다시 실행 · lsync 로 옮기기 · 일정 (앞의 모니터링 그대로)
  확인 창에서 취소하면 남기지 않음, 고른 폴더는 다음에 열 때 그대로 (rsyncPaths)
- 파일 탐색기: 모니터링 버튼 · rsync 빼고 현재 방식 · robocopy 만 (예전 값 rsync 는 현재 방식으로), 복사는 모니터링에 남기지 않음
- 환경 설정: [Rsync] 묶음 (rsync 옵션 · 가져오기 · 실시간 동기화 · 백그라운드로 실행), 복사 모니터링 스위치 없앰
- Windows 실제 rsync 로 → · ⇄ 시험 (integration_test/rsync_page_test.dart)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 18:28:32 +09:00
RyuJongJin b38253fd67 복사 모니터링 · 복사 기억 · lsync 일정 (cron + 격자 편집)
- 설정 [복사 모니터링] 켜면 파일 탐색기 가운데에 [모니터링] 버튼
- 복사 · rsync 탭: 복사 대상 기억, 진행률, 대상 디스크 용량, 옵션 고치기 → 저장 후 현재 유지 / 설정 반영 후 실행, 실행 · 재개 · 취소 · 지우기, lsync 로 이동
- lsync 탭: 맞출 파일 자동 표시, 지금 맞추기, 복사 · rsync 로 이동
- 동기화 시간: 계속 / cron 시간 창 (요일 × 시 격자로 칠해서 편집)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 11:16:05 +09:00
RyuJongJin 7308f8ce1b 파일 탐색기: 복사 · 이동 방법 (현재 방식 · rsync · robocopy), 속도 제한, 실시간 동기화, 아래 진행 막대
- 환경 설정 > 파일 탐색기: 파일 / 폴더 복사 방법, rsync · robocopy 옵션 (기본 -avPog · /E /COPY:DAT /DCOPY:T /R:2 /W:2,
  바꿀 수 있음), 여러 개를 고르면 항목마다 따로 (기본) / 한 번에, 속도 제한 KB/s (rsync --bwlimit · 현재 방식 앱 조절 · robocopy /IPG)
- rsync (Windows): 처음 쓸 때 MSYS2 공식 저장소에서 rsync 3.5.1 과 필요한 DLL 을 내려받기 (파일마다 SHA256 고정 검증),
  설정 폴더 rsync\ 에 둔다. 경로는 /cygdrive/c/... 로 바꿔 넘김. 또는 직접 지정 (Android 도 지정하면 사용)
- robocopy (Windows): 폴더마다 실행, 파일은 같은 폴더끼리, 출력에서 파일 수를 세어 진행 표시
- 실시간 동기화 (lsyncd 처럼): 원본 · 대상 폴더 쌍, Windows 는 폴더 감시로 바로, Android 는 30초마다, 방법 · 지우기 선택
- 복사 · 이동 진행: 아래에서 올라오는 막대 두 줄 (위: 전체 항목 중 · 아래: 지금 폴더의 파일 중), 끝나면 내려감
- 선택 모드의 ✔: 고르지 않은 것은 흐리게, 고른 것은 진하게
Android 태블릿 (Galaxy Tab S6 Lite) 에서 속도 제한 복사 · 진행 막대 확인. rsync 는 실제로 내려받아 시험 (JJ_NET_TESTS=1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 10:38:09 +09:00
RyuJongJin a485d0d997 파일 탐색기: 한 번 = 선택 · 두 번 = 실행, 스타일 (X-plore · Windows 탐색기 · Total Commander), 폴더 + 파일 목록 배치
- 환경 설정 > 파일 탐색기: 누르기 (한 번 선택 · 두 번 실행 (기본) / 한 번 바로 실행), 스타일, 창 배치
- 선택 모드: 폴더는 고르기만 (› 화살표로 펼치기), 두 번 누르면 펼치기 · 실행, Ctrl + 클릭 = 여러 개 고르기,
  길게 누르기 · 오른쪽 클릭 = 기능 메뉴. 표시 동그라미는 두 번 누르기를 기다리지 않고 바로
- 스타일: X-plore (썸네일 · 두 줄), Windows 탐색기 (컬러 아이콘 · 이름 / 수정한 날짜 / 유형 / 크기 열),
  Total Commander (촘촘한 줄 · [폴더] · 확장자 / <DIR> / 날짜 열)
- 창 배치 "폴더 + 파일 목록": 왼쪽 폴더 트리, 오른쪽 고른 폴더의 내용 (맨 위 ".." = 상위 폴더, 두 번 누르면 들어가기)
- 모양 · 배치가 바뀌면 보던 폴더로 다시 스크롤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 08:25:46 +09:00
RyuJongJin 99024d3c6e 파일 탐색기 (X-plore 참고): 두 창 트리 · 가운데 기능 버튼 · 창 배치 · 버튼 구성
- 위쪽 공통 버튼에 [파일 탐색기], 환경 설정 > 홈 화면에 "파일 탐색기" (앱을 켜면 바로)
- 두 창 (트리: 누르면 그 자리에서 펼치기 · 접기), 저장 장치 고르기 (Windows 드라이브 · Android 저장소)
- 동영상: 누르면 기본 동작 (내장 플레이어 또는 확장자별 재생 프로그램), 길게 누르기 · 오른쪽 클릭 메뉴
  (내장 플레이어로 재생 · 다른 앱으로 열기 · MKV 목록에 추가 · 이름 변경 · 복사 / 이동 · 삭제 · 정보)
- 썸네일 · 해상도 · 길이 (작업 중에는 썸네일을 만들지 않음), 그림 파일 미리 보기
- 가운데 버튼: 상위 폴더 · 새로 고침 · 재생 · MKV 목록에 추가 · 새 폴더 · 이름 변경 · 복사 · 이동 · 삭제 ·
  찾기 · 정렬 기준 · 숨은 항목 · 내역 · 창 배치 · 버튼 구성
- 창 배치: 두 창 / 한 창, 좌우 / 위아래 / 화면 모양 따라, 버튼 줄 두 창 사이 / 끝 / 숨김
- 버튼 구성: 보일 버튼 · 순서
- 다른 앱으로 열기: Windows "연결 프로그램" 창 · Android 앱 고르기 (FileProvider, SD 카드 포함)
- 여러 개 지울 때 확인 창에 이름 · 폴더를 보여 준다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 04:14:05 +09:00