1
0
Fork 0
Commit graph

47 commits

Author SHA1 Message Date
Yun Chan
50072124a9 chore(release): v1.0.22 - Windows 10/11 탐색기 우클릭 컨텍스트 메뉴 개선 (Shift 없이 일반 우클릭 즉시 노출, Windows 11 모던 1차 메뉴 패키지 연동) 2026-09-08 04:30:25 +09:00
Yun Chan
a4c64bafb9 fix(shell): resolve context menu shift-click requirement on Windows 10 & 11 2026-09-08 04:27:54 +09:00
Yun Chan
63d50c165d chore(release): v1.0.21 - 외부 도구 설치 마법사(첫 실행 카탈로그), 조종석 인체공학 및 100% 한국어 Fluent UI 개편, 산업 표준 상세 인코딩 옵션, git.chanpaca.net 인프라 단일화 2026-09-08 03:37:32 +09:00
Yun Chan
d6b7ec2274 agent update 2026-09-08 03:16:33 +09:00
Yun Chan
6a41c4a0dc feat(tools): add first-run external tool installer wizard and catalog
첫 실행 시 외부 도구 설치 마법사를 띄우고 7종(FFmpeg·LibreOffice·Pandoc·ImageMagick·H2Orestart·agy·Codex)을 기본 전체 선택 상태로 순차 설치한다.
- Core: ExternalToolCatalog(정적 카탈로그, winget ID 실검증), ExternalToolInstaller(winget 무인 실행·재감지 판정, IExternalCommandRunner 시드로 테스트 가능)
- Core: ExternalToolDetector에 winget FFmpeg 스캔 + Pandoc/ImageMagick 감지 추가
- App: ToolSetupWindow + ToolSetupViewModel, 첫 실행 플래그(setup.tools.done), 설정 창 '외부 도구 설치/검증' 재진입 버튼
- Tests: ExternalToolInstallerTests 5건
- 기존 미커밋 작업(광고 Ads 지원: AdBannerControl/AdLargeCardControl/AdService, AI 백엔드 agy·switchboard·codex 채팅 클라이언트, 관련 테스트) 포함
2026-09-07 21:16:49 +09:00
Yun Chan
f00f6567f4 fix(ui): eliminate top margin above inspector header by setting Grid.RowSpan=2 2026-09-05 13:02:53 +09:00
Yun Chan
388d6707d0 feat(ui): elevate cockpit ergonomics, add search watermark, queue selection styling, and shortcut bindings 2026-09-05 12:44:23 +09:00
Yun Chan
4ca7352dc3 feat(ui): default to active queue, scope search toolbar, add double-bezel inspector, optimize queue columns, and achieve 100% pure Korean UI 2026-09-05 12:25:30 +09:00
Yun Chan
455c8b1324 feat(options): implement granular fold-out encoding options with industry standards
- Adopt Microsoft Fluent 2 Progressive Disclosure pattern with AdvancedOptionsExpander
- Add ISO 32000 / Ghostscript PDF optimization panel (Light/Strong/Max, 150/200/300 DPI)
- Add W3C / MozJPEG Image panel with Lossless WebP/PNG and Progressive toggles
- Add FFmpeg video/audio granular controls (codecs, CRF/ABR rate control, presets, Loudnorm)
- Mirror advanced options in QuickOptionsWindow context dialog
- Add DesignAudit AST and visual tests for foldout structure (249 tests passing in 2s)
2026-09-05 07:29:46 +09:00
Yun Chan
7cb75fd3aa fix(ui): fix SettingsWindow and dialog titlebar margins, vertical alignment, and button styling 2026-09-05 06:36:26 +09:00
Yun Chan
1f794e9e08 fix(ui): unify titlebar centerline vertical alignment and eliminate redundant brand container (v1.0.14) 2026-09-04 23:58:41 +09:00
Yun Chan
8eb48ed854 chore(release): v1.0.8 - Release v1.0.8: Inno Setup 표준 설치 프로그램(Setup-x64.exe) 도입으로 인증서 경고 없는 1초 설치 지원, C++ Shell DLL Word 추천 누수 완전 박멸, 비디오/오디오/표 미디어 네고시에이션 전수 보강, 극복합 2홉 변환 및 복원력 시나리오 탑재 (220개 테스트 100% 통과) 2026-09-03 22:32:20 +09:00
Yun Chan
28624c386e feat(negotiation): comprehensive media conversion filter negotiation across graph, UI, and shell
- Prevent cross-category graph leakage (png -> txt -> docx) in ConversionGraph.FindBestPath and ReachableOutputs
- Distinguish Video and Audio in MediaConversionNegotiator (block mp3->gif, allow mp4->png frame extraction)
- Handle empty common output intersection in MainWindow without forcing .jpg fallback
- Expand PopularOutputs in ContextMenuRegistrar to support mp4, mp3, and xlsx
- Add comprehensive TDD unit tests (213 passing tests)
2026-09-03 18:47:45 +09:00
Yun Chan
07d7dfeb40 chore(release): v1.0.7 - 대대적인 UI/UX 개편: 1-클릭 최적화 프리셋, 실시간 검색/필터 바, 큐 일괄 처리 툴바, 프리뷰 인스펙터 고도화, 미디어 협상 도메인 필터링, Fluent 2 스타일 전면 적용
Some checks failed
Forgejo Release / build-and-release (push) Has been cancelled
2026-09-03 17:21:58 +09:00
Yun Chan
f1000cc838 fix(app): activate window on launch to ensure window foregrounding 2026-09-03 17:18:32 +09:00
Yun Chan
38de8ffab9 chore(release): v1.0.7 - 대대적인 UI/UX 개편: 1-클릭 최적화 프리셋, 실시간 검색/필터 바, 큐 일괄 처리 툴바, 프리뷰 인스펙터 고도화, Fluent 2 스타일 전면 적용
Some checks are pending
Forgejo Release / build-and-release (push) Waiting to run
2026-09-03 17:15:00 +09:00
Yun Chan
1e7b0e1bcf chore(release): bump version to 1.0.7 for clean MSIX deployment upgrade 2026-09-03 17:13:05 +09:00
Yun Chan
b67b3f1b61 feat(ui): implement 1-click presets, real-time search & filter bar, batch queue actions, and file inspector 2026-09-03 17:12:14 +09:00
Yun Chan
41c8a8a94b fix(ui): resolve pack URI assembly prefixes, crash-proof dynamic resource brush lookups, and add MainWindow visual tree test
Some checks failed
Forgejo Release / build-and-release (push) Has been cancelled
2026-09-03 12:30:21 +09:00
Yun Chan
c00c55f9e6 chore(release): v1.0.6 - TDD RED 체계 및 초엄격 디자인 감사 적용, UI 정렬/패딩/빈상태 결함 수정
Some checks are pending
Forgejo Release / build-and-release (push) Waiting to run
2026-09-03 12:23:02 +09:00
Yun Chan
4cd9c678c0 feat(tdd): implement SSOT canon, AGENTS.md, ultra-strict design audit, E2E scenarios, and Forgejo release pipeline
Some checks are pending
Forgejo Release / build-and-release (push) Waiting to run
2026-09-03 12:21:40 +09:00
Yun Chan
7d461d6ae4 feat(quick): 빠른 변환 간단 옵션 팝업 + 중간 취소 지원
컨텍스트 메뉴에서 형식(MP4/MP3 등) 선택 시 간단 옵션 팝업을 띄우고, 변환 중 취소를 지원한다.

- QuickOptionsWindow(신규): 출력 형식에 맞춘 간단 옵션(영상=품질CRF/해상도/GPU, 오디오=비트레이트,
  이미지=품질) 팝업. '변환'으로 진행, '취소'로 종료, '자세히 옵션…'으로 풀 UI(MainWindow) 전환.
  OptionsViewModel 재사용 → ToConvertOptions()로 변환 옵션 구성.
- App.RunQuickAsync: 변환 전 팝업 표시 + 선택 옵션 적용. ConvertManyAsync에 취소 토큰 전달(이전엔 None이라
  취소 불가였음). 변환 경로는 ShutdownMode=OnExplicitShutdown으로 전환해 **취소/창 닫기 시 ffmpeg를
  종료한 '뒤' 앱을 종료**(고아 프로세스·백그라운드 잔류 방지). 성공 시 결과 창 닫을 때까지 대기.
- QuickProgressWindow: 변환 중 '취소' 버튼 + 창 Closing 시 취소(CancellationTokenSource 주입).
  완료 시 취소 버튼 숨김.

버그 수정: 빠른 변환 진행 창을 닫아도 변환이 백그라운드에서 계속 돌던 문제 해결.
빌드 0/0, 106 테스트 그린, publish 후 팝업/일반 실행 크래시 없이 로드.
2026-06-02 21:35:47 +09:00
Yun Chan
c10da19bfd feat(ui): 영상·오디오 인코딩 옵션 패널 — 출력 형식별 동적 노출
OptionsViewModel + 옵션 패널에 영상/오디오 인코딩 옵션을 선언적 바인딩으로 노출.

- OptionsViewModel: 영상/오디오 ObservableProperty(코덱·레이트컨트롤·CRF·비트레이트·프리셋·해상도·fps·
  회전·디인터레이스·faststart·SpatialAq / 오디오 코덱·비트레이트·VBR·샘플레이트·채널·loudnorm) +
  BuildVideo()/BuildAudio()로 VideoEncodeOptions/AudioEncodeOptions 구성, ToConvertOptions에 연결.
- MainWindow.xaml: MediaPanel(VideoSubPanel/AudioSubPanel) — 레이트컨트롤 모드에 따라 CRF 슬라이더 ↔
  비트레이트 입력 DataTrigger 전환, 고급(회전/디인터레이스/SpatialAq)은 Expander. 전부 선언적 TwoWay 바인딩.
- 코드비하인드: UpdateMediaPanelForFormat — 출력이 영상이면 영상+오디오, 오디오면 오디오만 노출.
- 검증: 빌드 0/0, 106 테스트 그린, publish 후 메인 창 크래시 없이 로드. 옵션 실동작은 GUI 스모크 권장.
2026-06-02 20:16:31 +09:00
Yun Chan
944187c314 refactor(P5b-7): 잔여 이벤트 핸들러 전부 커맨드/behavior로 — XAML 이벤트 핸들러 0개
Microsoft.Xaml.Behaviors.Wpf 도입. MainWindow.xaml에 직접 이벤트 핸들러(Click/SelectionChanged/Drop/
MouseUp 등) 0개 — 전부 선언적 바인딩·커맨드·InvokeCommandAction으로 전환.

- 드래그앤드롭(DragOver/DragLeave/Drop) → i:EventTrigger + InvokeCommandAction(PassEventArgsToCommand),
  HandleDragOver/HandleFilesDropped(DragEventArgs) 추출.
- 동적 포맷 콤보 SelectionChanged → OutputFormatChangedCommand(OnOutputFormatSelected).
- 큐·이력 행 PreviewMouseLeftButtonUp → QueueRow/PastRowCommand(MouseButtonEventArgs, IsInsideButton 가드
  보존 + e.OriginalSource.DataContext로 항목 해소).
- ProcessQueueButton Click → ProcessQueueCommand.
- 검증: 빌드 0/0, 83 테스트 그린, publish 후 메인 창 크래시 없이 로드(behaviors self-contained 정상).
  드래그앤드롭·행 미리보기·포맷 변경 실동작은 GUI 스모크 권장(비치명적 실패 모드).
2026-06-02 10:17:21 +09:00
Yun Chan
ccba168f9a refactor(P5b-6): 옵션/탭/충돌/결합 핸들러 5개 → 선언적 바인딩·커맨드 (의존성 0)
새 패키지 없이 회귀 없는 핸들러 제거/전환:
- OnQualityChanged 제거 → QualityValueText.Text를 Options.Quality에 StringFormat 바인딩.
- OnAiTaskChanged 제거 → AiTargetLangPanel.Visibility를 AiTaskCombo.SelectedIndex DataTrigger로.
- OnTabClick 제거 → TabCommand(ToggleButton.Command + CommandParameter "Active"/"Past").
- OnConflictSegmentClick → SetConflictRule + ConflictRuleCommand(CommandParameter "Skip/Rename/Replace").
- OnCombineToggleChanged 제거 → CombineToggleCommand(CheckBox.Command, 토글 시 발화).
- 검증: 빌드 0/0, 83 테스트 그린, publish 후 메인 창 크래시 없이 로드(언핸들드 로그 없음).
- 잔여: 동적 포맷 콤보 SelectionChanged, 드래그앤드롭, 행 미리보기 클릭(IsInsideButton 가드), 복합 ProcessQueue 버튼.
2026-06-02 10:12:26 +09:00
Yun Chan
a05bbcf709 refactor(P5b-5): 버튼 Click 핸들러 10개 → 커맨드 바인딩
상호작용 핸들러 중 '커맨드화 가능한' 순수 버튼 클릭을 전부 RelayCommand + Command 바인딩으로 전환.

- 상단바 5개(Settings/Register/Diagnose/ExportLog/ClearAll) + 폴더선택/취소/미리보기열기
  + 항목제거(CommandParameter={Binding}) + 폴더열기(CommandParameter={Binding RevealPath}).
- OnRemoveQueueItem→RemoveQueueItem(QueueItem?), OnOpenFolderClick→OpenFolderForPath(string?) 추출
  (sender.Tag 의존 제거 → CommandParameter).
- 검증: 빌드 0/0, 83 테스트 그린, publish 후 메인 창 크래시 없이 로드(언핸들드 로그 없음).
- 잔여 핸들러는 MVVM에서도 뷰/behavior 영역: 드래그앤드롭, SelectionChanged/ValueChanged,
  미리보기 마우스클릭, 탭·충돌 ToggleButton 그룹(IsChecked 상호배제), 복합 상태 ProcessQueue 버튼.
2026-06-02 10:06:25 +09:00
Yun Chan
fa385178b2 refactor(P5b-4): 큐·이력 리스트 ItemsSource를 선언적 XAML 바인딩으로 전환
- MainWindow.ActiveQueue/PastResults(ObservableCollection) 노출. XAML: ActiveQueueList/PastResultsList의
  ItemsSource를 Window-relative 바인딩으로. 코드비하인드의 ItemsSource= 명령형 할당 제거.
- 검증: 빌드 0/0, 83 테스트 그린, publish 후 메인 창 크래시 없이 로드(언핸들드 로그 없음).
  리스트 렌더(큐/이력 표시)는 GUI 스모크 권장.
2026-06-02 10:01:24 +09:00
Yun Chan
6a4ac2d60c refactor(P5b-3): 옵션 패널 품질·출력폴더를 OptionsViewModel에 선언적 TwoWay 바인딩
뷰 바인딩 마이그레이션 첫 슬라이스 — 명령형 컨트롤 읽기를 선언적 XAML 바인딩으로 전환.

- MainWindow.Options(OptionsViewModel) 노출. XAML: QualitySlider.Value ↔ Options.Quality,
  OutputPathTextBox.Text ↔ Options.CustomOutputDirectory (TwoWay, Window-relative).
- BuildOptions: Quality/CustomOutputDirectory 수동 동기 제거(바인딩이 담당). 충돌/AI/GPU만 코드비하인드.
- 검증: 빌드 0/0, 83 테스트 그린, publish 후 메인 창 크래시 없이 로드(언핸들드 로그 없음 = XAML 파싱/구성 정상).
  비치명적 실패 모드(바인딩 오류 시 기본값 degrade, 크래시 없음) — 슬라이더/출력폴더 실동작은 GUI 스모크 권장.
2026-06-02 09:59:44 +09:00
Yun Chan
e95ec967e6 refactor(P5b-2): 출력 형식 교집합 로직을 ProviderRegistry로 추출 (매트릭스 필터 테스트화)
MainWindow.RefreshAvailableOutputFormats에 박혀 있던 '큐 전체 공통 출력' 교집합 계산을
ProviderRegistry.AvailableOutputsForFiles 순수 쿼리로 추출 — 코드비하인드 18줄 → 2줄, 헤드리스 테스트 가능.

- ProviderRegistry.AvailableOutputsForFiles(sourcePaths): 비면 전체 출력, 아니면 OutputsForFile 교집합.
- MainWindow: 인라인 교집합 루프 제거 → 레지스트리 메서드 호출. UI(콤보 빌드)는 그대로.
- 테스트 2개: 빈 입력=전체, png+csv 혼합 시 jpg가 교집합에서 빠짐(매트릭스 필터 핵심 동작).

81 → 83개 테스트 전부 그린, 빌드 0경고/0오류.
2026-06-02 09:53:26 +09:00
Yun Chan
ba5738e705 refactor(P5b-1): CommunityToolkit.Mvvm 도입 + OptionsViewModel 추출 (옵션 로직 테스트화)
MVVM 첫 슬라이스 — 테스트 불가능했던 코드비하인드 BuildOptions의 순수 옵션 구성 로직을
헤드리스 단위테스트 가능한 OptionsViewModel.ToConvertOptions로 추출. XAML 바인딩 미변경(런타임 위험 0).

- CommunityToolkit.Mvvm 8.2.2(CPM) + App.csproj. App/ViewModels/OptionsViewModel.cs:
  ObservableObject + [ObservableProperty](Quality/CustomOutputDirectory/ConflictRule/AiTaskIndex/
  TargetLanguage/VideoPreferGpu) → 향후 옵션 패널 직접 바인딩 토대. ToConvertOptions()는 순수.
- MainWindow.BuildOptions: 컨트롤 값을 VM에 반영 후 ToConvertOptions() 위임(동작 동일).
- Tests → App ProjectReference 추가(App 뷰모델 헤드리스 테스트 가능화).
- OptionsViewModelTests 10케이스(품질매핑·AVIF clamp·커스텀폴더 trim·AI작업·대상언어·충돌/GPU).

71 → 81개 테스트 전부 그린, 빌드 0경고/0오류.
2026-06-02 09:51:49 +09:00
Yun Chan
379a4a738d refactor(P4): ConvertOptions God Object → 불변 record (init-only)
mutable sealed class(13 sub-record 가변)을 불변 record로 전환 — 배치 병렬 변환(P6)에서
공유해도 안전한 스레드 안전 전제 확보 + 값 의미론. 시그니처(ConvertAsync(ConvertOptions))는 비침습 유지.

- ConvertOptions + 13개 옵션 타입(Jpeg/Png/Webp/Avif/Tiff/Bmp/Gif/PdfRender/PdfBuild/HtmlRender/
  Ocr/PdfCompress/Ai) → sealed record, 전 프로퍼티 get;init;. 8개 Provider의 READ는 무영향.
- 변이 5곳을 with 식/객체 초기화로 교정(WRITE만 깨지므로 국소적):
  MainWindow.BuildOptions(한 식으로 불변 구성), App.RunQuickAsync(with), OcrProvider(PdfRender 초기화),
  특성화 테스트 2곳, ImageOptimProviderTests.
- 카테고리 분해(RoutingOptions/OutputOptions)는 reader 파급이 커서 후속으로 보류(비침습 우선).

70개 테스트 전부 그린(골든마스터 동일성 = 동작 불변), 빌드 0경고/0오류.
2026-06-02 09:40:07 +09:00
Yun Chan
12bda2dcbf refactor(P5a): App DI 컴포지션 루트 + MainWindow 생성자 주입 (서비스로케이터 제거)
MVVM(P5b)의 선행조건 — 엔진/설정을 생성자 주입으로 가시화하고 서비스로케이터 결합을 제거.

- App.xaml.cs: new DpapiSettingsStore()+CreateDefault() 직접 생성 → ServiceCollection.AddEverything2Everything()
  (P2 DI 재사용) 컴포지션 루트. Settings/Engine은 컨테이너 단일 싱글턴에서 해소(공유 보존).
  Generic Host 대신 ServiceProvider 사용 — Environment.Exit 진입점과 라이프사이클 충돌 회피(적대적 리뷰 반영).
- MainWindow: ((App)Application.Current).Engine/.Settings 서비스로케이터 8곳 → 생성자 주입 _engine/_settings.
  App.ShowMainWindow/ShowConvertDialog가 주입. 헤드리스 테스트 가능성 토대.

70개 테스트 전부 그린, 빌드 0경고/0오류.
2026-06-02 09:37:35 +09:00
Yun Chan
f36ee299f4 refactor(P0): CPM 도입 + Magick.NET 14.13.1 통일
- src/Directory.Packages.props 신규 — 모든 PackageReference 버전의 단일 출처(SSOT)
- ManagePackageVersionsCentrally=true, 3개 csproj에서 Version 속성 제거
- Magick.NET-Q16-AnyCPU Core 14.13.0 → 14.13.1로 통일(Tests와 정합)
  테스트와 프로덕션이 동일 네이티브 바이너리로 동작 → 골든마스터 신뢰 기반 확보

빌드 0경고/0오류, 38개 테스트 전부 그린.
2026-06-01 23:02:16 +09:00
Yun Chan
47600d2eb5 fix: mp4 변환 멈춤 해결 — 8K HEVC 코덱 + 동일포맷 재인코딩 + 종료상태
증상: 8K(7680x4320) HEVC 11분 6.76GB mp4 변환이 멈춤.

근본 원인 2가지:
1. mp4→mp4(같은 형식)이 그래프 self-edge 부재로 Skip 처리되고,
   QuickProgressWindow가 '전부 건너뜀' 종료 상태를 처리 안 해 멈춘 듯 보임.
2. 강제하던 h264_nvenc가 4096px 초과(8K)를 인코딩 못 해 즉시 실패 →
   CPU libx264 8K 폴백이 사실상 무한정 소요(진짜 멈춤).

수정:
- FfmpegProvider: 해상도별 코덱 — videoWidth>4096(8K 등)은 hevc_nvenc(GPU)
  →libx265(CPU)로, 이하는 h264_nvenc→libx264. 코덱 강제는 mp4/mkv/mov에만
  적용하고 webm/avi/gif는 컨테이너 기본 코덱(vp9 등) 유지.
- FfmpegProvider: 비디오/오디오 동일포맷 self-edge 추가(mp4→mp4 등 재압축).
  gif는 제외 — 이미지로도 다뤄져 ffmpeg 미설치 시 Skip→하드실패 회귀 방지.
- QuickProgressWindow.Finish: 성공·실패 없이 전부 건너뜀인 종료 상태를 명확히 안내.

검증: 실제 8K HEVC 클립으로 mp4→mp4 변환 → hevc_nvenc로 정상 인코딩,
28.3MB→2.1MB(93% 압축). 전체 38개 단위테스트 통과(적대적 리뷰 2건 반영).
Package 1.0.3.0.
2026-06-01 22:25:12 +09:00
Yun Chan
acb3fdbfd1 feat: imagegen2 아이콘·글리프·일러스트 생성 후 GUI 전면 적용 (투명 배경)
codex noninteractive + imagegen2로 앱 비주얼 에셋 일괄 생성, 코드 생성 차단
(gen-one.sh: FORBID 블록 + 코드파일 감지 + 재시도). 모든 산출물은
플러드필 배경 제거로 진짜 알파 투명 PNG화.

생성 에셋 (assets-gen/):
- app-master: 앱 아이콘 마스터 (사이클 화살표, 솔리드 타일 유지)
- 카테고리 글리프 8종: image/video/audio/document/data/vector/archive/ai
- 일러스트 2종: illus-empty(드롭존), illus-done(완료)
- logo-mark: 브랜드 마크

GUI 적용:
- 사이드바 헤더 브랜드 → logo-mark
- 드롭존 빈 상태 → illus-empty
- QuickProgressWindow 완료 → illus-done
- AI 작업 패널 → glyph-ai 스파클
- 큐/과거결과 행 라벨 아이콘 → 카테고리 글리프 (CategoryGlyphs 매핑)
- 미리보기 placeholder → 형식별 카테고리 글리프 (경고 대신)

앱 아이콘:
- app.ico (멀티 크기 16~256) + 윈도우 Icon
- MSIX 타일 4종(Square44/150·Wide310·Store) app-master 기반 갱신
- Package 버전 1.0.2.0
2026-06-01 22:00:53 +09:00
Yun Chan
ef10c139cd fix: 빠른 변환 진행 표시(제목 동적+%) + 영상→이미지 프레임 추출 + GPU 가속
사용자 리포트: mp4 변환 시 %안나오고 멈춤, JPEG 고정 문구, GPU 가속 부재.

- QuickProgressWindow: 제목/타이틀바를 출력 형식으로 동적화('JPEG 고정' 해결), % 텍스트 + indeterminate 표시
- FfmpegProvider: 영상→이미지(jpg/png/webp/bmp) 대표 프레임 추출 직접 엣지 (mp4→jpg가 무거운 mp4→gif→jpg 멀티홉 거치던 문제 해결)
- GPU 가속: ConvertOptions.VideoPreferGpu(기본 on) — NVENC 시도 후 실패 시 CPU 자동 폴백, 설정창 토글로 제어
- 테스트 38개 통과
2026-06-01 21:28:55 +09:00
Yun Chan
e30559b3cd feat(ui): 디자인 마무리 — AI 작업종류 옵션 + 큐 accent bar + 빈 상태 + polish
디자인 세션 마지막 단계(순차 workflow). Linear/Geist 영감 polish + AI 작업 선택 UI.

- AI 작업종류 ComboBox(요약/번역/교정) + 번역 대상언어 → BuildOptions의 opts.Ai.Task/TargetLanguage 연결. 이제 Codex로 번역·교정도 가능
- 큐 row 좌측 형식색 accent bar + hover, 빈 상태(Browse + 안내) 개선
- FormatShiftTheme: FsNumStyle/FsLossPillStyle/FsListRowStyle/FsIconButtonStyle 재사용 스타일
2026-06-01 16:03:50 +09:00
Yun Chan
5c7a4a9ee3 feat(ui): 출력 드롭다운에 형식 색 dot + 손실 등급 dot
변환 전에 '무엇으로 / 얼마나 보존되나'를 한눈에. 드롭다운 각 항목을 형식색 dot(8px) + 라벨 + 손실 등급 dot(6px, 큐 입력 기준 worst-case)로 렌더링.

- 형식색: FormatPalette.For 색 (csv 틸·json 골드·svg 핑크·영상 코랄·오디오 퍼플)
- 손실 dot: Lossless 초록 / Container 회색 / Recode 앰버 / Rasterize 빨강 (hover 툴팁)
- 손실 계산: ConversionGraph.FindBestPath worst Loss
2026-06-01 15:11:36 +09:00
Yun Chan
2a3d220db4 feat(ui): AI 설정창 + Codex CLI OAuth 백엔드 + ⚙ 진입점
사용자 원래 요구였던 Codex non-interactive OAuth를 실제 동작까지 검증해 통합. ChatGPT 구독으로 API 키 없이 AI 변환.

- CodexChatClient: codex exec --skip-git-repo-check --ephemeral -o <file> - (stdin 프롬프트). 실제 한글→영어 번역 검증 완료
- ExternalProcessRunner: stdin 지원 + UTF-8 인코딩(한글 깨짐 해결)
- ExternalToolDetector.IsCodexAvailable() + public 승격
- LlmProvider: codex 백엔드 + auto 폴백(키 없으면 Codex)
- SettingsWindow: OpenAI/Anthropic 키(2단계 Verify) + Codex(OAuth) + 외부도구 상태/다운로드 CTA + 모델 선택
- App.Settings를 LlmProvider와 공유(키 저장 즉시 반영)
- MainWindow 네비바 ⚙ 설정 진입점
- 디자인: Cursor/Zed/Raycast 설정 UX + Radix 상태 토큰 영감
2026-06-01 14:47:07 +09:00
Yun Chan
faffb8f205 feat(ui): 형식 색상 + 손실/상태 시맨틱 토큰 (Catppuccin/Material/Radix 영감)
디자인 리서치(VS Code Material Icon Theme·Seti UI·Linguist·Radix dark·Catppuccin·Linear·Geist) 기반으로 형식 색상과 시맨틱 토큰을 확장.

- 신규 형식색 FsFmtCsv/Xlsx/Json/Svg/Video/Audio (회색→카테고리별 hue) + AllFormats/FormatPalette 매핑
- 손실 등급 토큰 FsLoss*(Lossless=초록/Container=회색/Recode=앰버/Rasterize=빨강, Radix dark)
- 상태 토큰 FsStatus*(Success/Warn/Danger/Info × dot/text/bg)
- Geist식 8% 투명 보더 FsBorderHairline
2026-06-01 14:32:59 +09:00
Yun Chan
df07eb9bdd fix: UI 출력 형식 카탈로그 확장 + 멀티홉 노출 2홉 제한
구버전 앱에서 새 변환이 드롭다운에 안 보이던 문제 — AllFormats(UI 화이트리스트)에 데이터/벡터/영상/오디오 형식이 없었음. 추가.

- AllFormats에 csv/json/xlsx/svg + 영상(mp4/webm/mkv/mov/avi) + 오디오(mp3/aac/m4a/opus/ogg/flac/wav) 16종 추가
- OutputsForInput 노출 maxHops 3→2: html→png→gif→mp4 같은 카테고리 횡단 과도 노출 차단 (실제 변환 FindBestPath는 3홉 유지)
- 테스트 38개 통과
2026-06-01 14:04:22 +09:00
Yun Chan
25bebb46bf feat: 텍스트 문서 5종 양방향 변환 매트릭스 (DocumentProvider)
신규 DocumentProvider — html/htm/hwp/hwpx/docx/doc/md/markdown/txt 입력 →
html/docx/md/txt 출력 (HWP 출력은 H2Orestart 한계로 미지원).

라우팅 (멀티홉)
- {docx, html, txt, hwp} ↔ {docx, html, txt}: LibreOffice --convert-to
- md → html: Markdig (advanced extensions)
- html → md: ReverseMarkdown (GitHub flavored)
- md → docx/txt: md → html(Markdig) → LibreOffice 체인
- {docx, html, hwp} → md: → html(LibreOffice) → md(ReverseMarkdown) 체인
- md ↔ txt, html ↔ html 등: trivial copy
- txt → html: pre-wrapped HTML 인코딩

NuGet 추가
- Markdig 0.37.0
- ReverseMarkdown 4.6.0 (HtmlAgilityPack 의존성 자동 포함)

UI/메뉴 갱신
- AllFormats에 .html, .md 추가 (총 12종)
- PopularOutputs 카스케이드 12개로 확장:
  JPEG/PNG/WebP/PDF/Word/HTML/MD/TXT/AVIF/GIF/TIFF/BMP

요구 외부 도구: LibreOffice (DocxProvider/HwpxProvider와 공통)
MSIX 갱신: Markdig.dll + ReverseMarkdown.dll + HtmlAgilityPack.dll 포함
2026-05-07 17:22:15 +09:00
Yun Chan
198a39fd84 fix: Past Results 폴더 버튼이 출력 파일을 select하도록 변경
- HistoryEntry에 OutputPaths (nullable list) 추가, PrimaryOutputPath 헬퍼
- HistoryRow에 OutputPath + RevealPath (output 우선, fallback to source)
- AddToHistory 호출 시 result.OutputPaths.ToList() 전달
- XAML 폴더 버튼 Tag를 RevealPath로, ToolTip '출력 파일이 있는 폴더 열기'

이전 history.jsonl은 OutputPaths 없이 저장됨 — 새 변환부터 출력 select
2026-05-07 16:44:59 +09:00
Yun Chan
81d0a04eb0 feat: 진행 표시 보강 — 취소 버튼 + 큐 row inline progress bar
사이드바 진행 패널
- '취소' 버튼 추가 (FsSecondaryButtonStyle, ProcessingPercentLabel 우측)
- 클릭 시 _cts.Cancel() + 라벨/버튼 '취소 중…'으로 전환
- finally에서 버튼 상태 복원

큐 row inline progress
- QueueItem에 ProgressValue (0~100), ProgressVisibility 속성 추가
- SetState() 안에서 텍스트 파싱: 'queued'/'done'/'NN%' → 자동 갱신
- ItemTemplate에 Height=3 ProgressBar 추가 (MetaLine 아래)
- 변환 중인 row만 시각적 bar 표시
2026-05-07 16:40:38 +09:00
Yun Chan
ae897ea043 feat: 메인 창 사이드바에 변환 진행 표시 패널 추가
ProcessQueueButton 위에 ProcessingProgressPanel:
- 현재 변환 중인 파일명 (이름만, ellipsis 처리)
- N / Total 카운터
- 0~100% ProgressBar (Index + FileProgress 기준 누적)
- % 텍스트

ShowProcessingProgress(total) → 변환 시작 시 표시,
UpdateProcessingProgress(p) → reporter 콜백에서 실시간 갱신,
HideProcessingProgress() → finally에서 숨김
2026-05-07 16:37:54 +09:00
Yun Chan
2633a928c1 feat: 배치 결합 모드 + IExplorerCommand DLL 카스케이드
#10 다중 이미지 → 단일 PDF/TIFF/GIF 결합
- ConversionEngine: BatchMode { Independent, CombineToSingle } enum 추가
- ConvertManyAsync에 batchMode 파라미터, CombineToSingle 시 N:1 라우팅
- CombineAsync: MagickImageCollection으로 모든 입력 디코드 후
  단일 다중-페이지 파일로 출력 (PDF/TIFF/GIF만 지원)
- 결합 가능 검증: ImageMagick 디코드 가능 입력 + 결합 가능 출력
- 정적 헬퍼 CanCombine(outputExt), CanCombineInput(sourcePath)

UI
- MainWindow.xaml에 '단일 파일로 결합' CheckBox 추가
  (출력이 결합 가능 + 큐 ≥2 + 모든 입력 결합 가능일 때 활성화)
- 큐 변경/형식 변경 시 토글 상태 + 안내 텍스트 자동 갱신
- MainWindow.xaml.cs UpdateCombineState / OnCombineToggleChanged

#9 IExplorerCommand DLL 카스케이드 (MSIX 메인 메뉴)
- dllmain.cpp 전면 재작성:
  RootCascadeCommand (CLSID F1A2B3C4-...-2B3C4D5E6F70)
  + 11개 동적 SubVerbCommand
  + SubCommandEnumerator (IEnumExplorerCommand)
  + ECF_HASSUBCOMMANDS 플래그
- 서브메뉴 항목: JPEG/PNG/WebP/PDF/TXT/DOCX/AVIF/GIF/TIFF/BMP/변환…
- 기존 Quick/Dialog 핸들러는 backward compat용으로 유지
- 빌드: x64 Release Everything2Everything.Shell.dll (207KB)

Package.appxmanifest
- com:Class에 RootCascadeCommand CLSID 등록
- 모든 desktop5:ItemType verb를 Quick+Dialog 두 개에서 단일 Convert로 통합
  (29개 ItemType × 2 verbs → 29 × 1 verb)

quick CLI는 기본 .jpg 호환 유지, dialog는 메인 창에서 형식 선택

빌드: dotnet 0 errors, MSBuild C++ 0 errors
2026-05-07 15:46:38 +09:00
Yun Chan
9b7e5f0d0c feat: Everything2Everything 양방향 변환 매트릭스 피보팅
EverythingToJpeg(N→JPEG 단방향)에서 Everything2Everything(N×M 매트릭스)으로
앱을 피보팅. 7개 Provider, 200+ 변환 쌍 지원.

리네이밍
- 디렉토리/솔루션/csproj/namespace/AssemblyName/MSIX Identity 일괄 치환
- 임시파일 prefix e2j_ → e2e_, 로고 라벨 E2J → E2E

아키텍처
- ConversionPair(input, output) 신규 + ProviderCapability.SupportedConversions
- IConverterProvider.ConvertAsync에 outputExtension 파라미터 추가
- ProviderRegistry를 Dictionary<(input, output), Provider> 매트릭스로 재작성
  + OutputsForInput / OutputsForFile 쿼리 API
- ConversionEngine: 출력 ext 라우팅, 동일 입출력 자동 skip,
  서브폴더 suffix를 출력 ext에서 자동 도출
- ConvertOptions를 형식별 sub-record로 분리
  (Jpeg/Png/Webp/Avif/Tiff/Pdf*/Html*/Ocr)

Provider 매트릭스
- MagickProvider: PNG/JPEG/WebP/AVIF/BMP/TIFF/GIF/PDF 양방향 + RAW/PSD 디코딩
  (단일이미지→1페이지 PDF, GIF/TIFF→다페이지 PDF)
- HeicProvider: HEIC/HEIF → 이미지 7종
- PdfProvider: PDF → 이미지 6종 (PNG임베드 후 ImageMagick 인코딩)
- HtmlProvider: HTML/HTM → 이미지 + PDF (CDP printToPDF)
- DocxProvider/HwpxProvider: PDF + 이미지 7종 (LibreOffice 활용)
- OcrProvider 신규: 이미지/PDF → TXT/DOCX
  (Windows.Media.Ocr + DocumentFormat.OpenXml, PDF는 페이지별 OCR 후 결합)

UI
- 사이드바 TARGET FORMAT을 동적 ComboBox로 (큐 파일 매트릭스의 교집합만 표시)
- 출력 형식별 색상 배지 + Quality 패널 라벨 동적
- OUTPUT DESTINATION hint도 출력 ext 기반 동적

CLI
- 신규 'to <ext> <files...>' verb (예: to png photo.heic doc.docx)
- help 텍스트 양방향 컨셉으로 갱신

셸 통합
- ContextMenuRegistrar 카스케이드로 재설계
  (ExtendedSubCommandsKey + Everything2Everything.SubMenu.<ext>)
- 입력별 매트릭스에 따라 인기 출력 10종(JPEG/PNG/WebP/PDF/TXT/DOCX/AVIF/GIF/TIFF/BMP)
  동적 노출, 마지막에 '변환…' 옵션
- 메뉴 라벨 'JPEG로 변환' → 'Everything2Everything으로 변환'

기타
- Core.csproj TFM net9.0-windows → net9.0-windows10.0.19041.0 (WinRT API용)
- DocumentFormat.OpenXml 3.1.0 NuGet 추가
- README 양방향 매트릭스 기준 전면 개편
- MSIX appxmanifest Description / IExplorerCommand DLL 라벨 갱신

빌드: 0 errors, 0 warnings
2026-05-07 13:40:08 +09:00