Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
246 commits
Select commit Hold shift + click to select a range
9aa8455
refactor: 프로퍼티 패널 관심사 분리
lee-sihun Aug 29, 2026
271645c
refactor: 스토어 영속화와 자산 참조 분리
lee-sihun Aug 29, 2026
a8fe038
refactor: Rust 대형 모듈 테스트 분리
lee-sihun Aug 29, 2026
4da0e8d
test: ASIO 출력 정책 검증 보강
lee-sihun Aug 29, 2026
8b41337
refactor: 키음 출력 설정 관심사 분리
lee-sihun Aug 29, 2026
8ce5dda
chore: 플랫폼 import 경고와 테스트 포맷 정리
lee-sihun Aug 29, 2026
877be76
refactor: 배치 속성 패널 UI 책임 분리
lee-sihun Aug 29, 2026
3e987d7
refactor: 단일 선택 패널 유형별 분리
lee-sihun Aug 29, 2026
6f7c1da
refactor: 스토어 사운드 자산 복구 분리
lee-sihun Aug 29, 2026
96b3c4e
docs: 대형 모듈 리팩터링 계획 기록
lee-sihun Aug 29, 2026
378c68a
refactor: 에디터 의미 연산 투영 분리
lee-sihun Aug 29, 2026
7713483
refactor: 에디터 요소 연산 도메인 분리
lee-sihun Aug 29, 2026
50bee95
refactor: 프로퍼티 패널 편집 세션 훅 분리
lee-sihun Aug 29, 2026
4e71c2c
refactor: 프로퍼티 패널 가시성 생명주기 분리
lee-sihun Aug 29, 2026
26fd922
refactor: 창 좌표와 패널 bounds 책임 분리
lee-sihun Aug 29, 2026
151fe52
docs: 대형 모듈 리팩터링 진행 상태 갱신
lee-sihun Aug 29, 2026
4503631
refactor: 그리드 컨텍스트 메뉴 모델 분리
lee-sihun Aug 29, 2026
40bd6aa
refactor: 그리드 복제 고스트 UI 분리
lee-sihun Aug 29, 2026
d0ba651
refactor: 그리드 범위 선택 모델 공용화
lee-sihun Aug 29, 2026
a19898a
refactor: 통계 유형 표시 모델 공용화
lee-sihun Aug 29, 2026
6f0724d
refactor: 키음 출력 모델 재사용 경계 정리
lee-sihun Aug 29, 2026
57c97a2
refactor: 배치 선택 모델 입력 계약 분리
lee-sihun Aug 29, 2026
220f141
refactor: 그리드 요소 상호작용 훅 공용화
lee-sihun Aug 29, 2026
04034f0
refactor: 안정 이벤트 슬롯 훅 공용화
lee-sihun Aug 29, 2026
b872736
refactor: 그리드 네이티브 요소 장면 분리
lee-sihun Aug 29, 2026
d6f174f
refactor: 그리드 선택 오버레이 장면 분리
lee-sihun Aug 29, 2026
8546830
refactor: 네이티브 컨텍스트 메뉴 액션 공용화
lee-sihun Aug 29, 2026
35f6de2
refactor: 선택 요소 드래그 생명주기 분리
lee-sihun Aug 29, 2026
97d12ae
refactor: 선택 요소 이동 모델 공용화
lee-sihun Aug 29, 2026
2a28b86
refactor: 선택 클립보드 스냅샷 모델 분리
lee-sihun Aug 29, 2026
30a9ddb
refactor: 선택 붙여넣기 계획 모델 분리
lee-sihun Aug 30, 2026
1493409
refactor: 플러그인 요소 레이아웃 모델 분리
lee-sihun Aug 30, 2026
a2e231d
refactor: 플러그인 DOM 상호작용 어댑터 공용화
lee-sihun Aug 30, 2026
895f74f
refactor: 에디터 직렬 작업 큐 분리
lee-sihun Aug 30, 2026
c3c9464
refactor: 에디터 커밋 재시도 정책 분리
lee-sihun Aug 30, 2026
3612fdb
refactor: 요소 런타임 및 이미지 속성 연산 분리
lee-sihun Aug 30, 2026
17ee0f2
refactor: 키음 트림 오디오 모델 분리
lee-sihun Aug 30, 2026
abc2445
refactor: 카운터 애니메이션 편집 모델 분리
lee-sihun Aug 30, 2026
4cd766f
refactor: 색상 피커 입력 컴포넌트 분리
lee-sihun Aug 30, 2026
1899f2b
refactor: 색상 피커 팔레트 컨트롤 분리
lee-sihun Aug 30, 2026
e021008
refactor: 숫자 입력 필드와 draft 모델 분리
lee-sihun Aug 30, 2026
461c8be
refactor: 키보드 런타임 상태 모델 분리
lee-sihun Aug 30, 2026
7b7a5a3
refactor: 애플리케이션 종료 생명주기 분리
lee-sihun Aug 30, 2026
077e883
refactor: 스토어 에디터 트랜잭션 헬퍼 분리
lee-sihun Aug 30, 2026
19e88db
refactor: 프리셋 로드 테스트 모듈 분리
lee-sihun Aug 30, 2026
8e5aaa8
refactor: 프리셋 자산 복원 책임 분리
lee-sihun Aug 30, 2026
baed02b
refactor: 오디오 출력 테스트 모듈 분리
lee-sihun Aug 30, 2026
5e00097
refactor: 오디오 클립 처리 계층 분리
lee-sihun Aug 30, 2026
435578f
refactor: 오디오 명령 스레드 런타임 분리
lee-sihun Aug 30, 2026
c73f204
refactor: 사운드 커맨드 테스트 모듈 분리
lee-sihun Aug 30, 2026
805894a
refactor: 사운드 라이브러리 스캔 분리
lee-sihun Aug 30, 2026
576ac46
refactor: WAV 원자 교체 처리 분리
lee-sihun Aug 30, 2026
8b3fc7d
test: Windows ASIO 출력 정책 게이트 추가
lee-sihun Aug 30, 2026
4c26130
refactor: 노브 표시 표면 공용화
lee-sihun Aug 30, 2026
03a2d90
refactor: 키보드 데몬 제어 모듈 통합
lee-sihun Aug 30, 2026
83c3028
refactor: 플러그인 스토리지 트랜잭션 분리
lee-sihun Aug 30, 2026
44ad66d
docs: 코드 품질 리팩터링 진행 상태 갱신
lee-sihun Aug 30, 2026
c4d081a
docs: 독립 코드 품질 감사 결과 기록
lee-sihun Aug 30, 2026
d499464
refactor: 배치 그래프 설정 공용화
lee-sihun Aug 30, 2026
cff68b9
refactor: 오버레이 장면 타입 경계 정리
lee-sihun Aug 30, 2026
290c85a
refactor: Grid 카운터 프리뷰 표면 공용화
lee-sihun Aug 30, 2026
a4a1468
refactor: Key와 Stat 표시 표면 공용화
lee-sihun Aug 30, 2026
9ae9a78
refactor: 배치 선택 조회 snapshot 도입
lee-sihun Aug 30, 2026
aaf5875
test: Windows ASIO 정책 검증 보강
lee-sihun Aug 30, 2026
1548e03
refactor: store 편집기 커밋 구현 분리
lee-sihun Aug 30, 2026
b32422b
refactor: store 제스처 커밋 구현 분리
lee-sihun Aug 30, 2026
0491a8c
refactor: store 히스토리 복원 구현 분리
lee-sihun Aug 30, 2026
7f7572a
refactor: store 레거시 트랜잭션 구현 분리
lee-sihun Aug 30, 2026
322a079
refactor: app state 프론트엔드 생명주기 분리
lee-sihun Aug 30, 2026
5988d26
refactor: app state 패널 런타임 분리
lee-sihun Aug 30, 2026
b12ba70
refactor: app state 오버레이 런타임 분리
lee-sihun Aug 30, 2026
fbf8294
refactor: 프로퍼티 패널 배치 기하 제어 분리
lee-sihun Aug 30, 2026
e87e248
refactor: 편집기 rebase 모델 분리
lee-sihun Aug 30, 2026
3343c96
refactor: 배치 사운드 섹션 분리
lee-sihun Aug 30, 2026
ee3dc91
refactor: 배치 그림자 섹션 분리
lee-sihun Aug 30, 2026
6c70256
refactor: 배치 타이포그래피 섹션 분리
lee-sihun Aug 30, 2026
9f15411
test: 그래프 history 애니메이션 계약 보강
lee-sihun Aug 30, 2026
e223363
refactor: 그래프 history 애니메이션 훅 공용화
lee-sihun Aug 30, 2026
91d11bb
refactor: 플러그인 요소 컨텍스트 메뉴 분리
lee-sihun Aug 30, 2026
7bbb280
refactor: app state 카운터 런타임 분리
lee-sihun Aug 30, 2026
9f0a2d3
refactor: app state 오디오 런타임 분리
lee-sihun Aug 30, 2026
15f100d
refactor: app state CSS 런타임 분리
lee-sihun Aug 30, 2026
dc8549f
refactor: 편집기 op transition 구현 분리
lee-sihun Aug 30, 2026
955a755
refactor: 키 명령 커스텀 탭 구현 분리
lee-sihun Aug 30, 2026
b4e8df1
refactor: 배치 전용 패널 파일 분리
lee-sihun Aug 30, 2026
e724582
refactor: 배치 이미지 피커 표면 공용화
lee-sihun Aug 30, 2026
6988b84
refactor: 사운드 설정 표면 공용화
lee-sihun Aug 30, 2026
c5880ec
refactor: 단일 스타일 기하 섹션 분리
lee-sihun Aug 30, 2026
97d85b8
refactor: 단일 스타일 타이포그래피 분리
lee-sihun Aug 30, 2026
bb56d6e
refactor: 단일 스타일 외형 섹션 분리
lee-sihun Aug 30, 2026
fb10fd3
refactor: 단일 스타일 키 매핑 분리
lee-sihun Aug 30, 2026
35d7794
refactor: 단일 스타일 이미지 피커 분리
lee-sihun Aug 30, 2026
3165303
refactor: 단일 스타일 색상 제어 훅 분리
lee-sihun Aug 30, 2026
d51babc
refactor: 단일 노트 페인트 훅 분리
lee-sihun Aug 30, 2026
f0f750e
refactor: 프로퍼티 패널 배치 커밋 훅 분리
lee-sihun Aug 30, 2026
0a5f07b
refactor: 프로퍼티 패널 배치 색상 제어 분리
lee-sihun Aug 30, 2026
751e47d
refactor: 모델 위치 정규화 구현 분리
lee-sihun Aug 30, 2026
850d6da
test: 리사이즈 간격 가이드 정책 고정
lee-sihun Aug 30, 2026
b864687
refactor: 리사이즈 프리뷰 계산 공용화
lee-sihun Aug 30, 2026
46e99fd
refactor: 배치 피커 타입 계약 단일화
lee-sihun Aug 30, 2026
e0756cf
refactor: 단축키 모델 구현 분리
lee-sihun Aug 30, 2026
072fc51
refactor: 부트스트랩 모델 분리
lee-sihun Aug 30, 2026
d030700
refactor: 설정 모델 구현 분리
lee-sihun Aug 30, 2026
41f10b4
test: 플러그인 요소 런타임 계약 보강
lee-sihun Aug 30, 2026
92855da
refactor: 선택 붙여넣기 정산 분리
lee-sihun Aug 30, 2026
0e7efa5
refactor: 히스토리 admission gate 분리
lee-sihun Aug 30, 2026
727d912
refactor: 플러그인 요소 런타임 훅 분리
lee-sihun Aug 30, 2026
479e92f
test: 단일 키 매핑 선택 전환 계약 보강
lee-sihun Aug 30, 2026
1be43f0
test: 커스텀 탭 IPC 명령 계약 보강
lee-sihun Aug 30, 2026
02b69d7
test: 리사이즈 size guide 계약 보강
lee-sihun Aug 30, 2026
2c1ee5a
refactor: Graph와 Knob 단일 편집 표면 공용화
lee-sihun Aug 30, 2026
71630a4
test: 오버레이 키 상태 런타임 계약 보강
lee-sihun Aug 30, 2026
8568d5d
refactor: 오버레이 키 상태 런타임 분리
lee-sihun Aug 30, 2026
b94e468
test: 리사이즈 앵커 검증을 실제 컴포넌트에 연결
lee-sihun Aug 30, 2026
5724ce1
test: 메인 다이얼로그 런타임 계약 보강
lee-sihun Aug 30, 2026
9fa7b40
refactor: 메인 다이얼로그 런타임 분리
lee-sihun Aug 30, 2026
fe8a7ff
refactor: 마이그레이션 손상 복구 모듈 분리
lee-sihun Aug 30, 2026
2c08575
test: 노브 표면 페인트 전환 계약 보강
lee-sihun Aug 30, 2026
2e6f78e
refactor: 키와 노브 표면 페인트 제어 공용화
lee-sihun Aug 30, 2026
5003192
test: 카운터 재동기화 직렬화 계약 보강
lee-sihun Aug 30, 2026
15e9e05
refactor: 앱 카운터 재동기화 런타임 분리
lee-sihun Aug 30, 2026
129e389
test: 숫자 입력 정책 공통 계약 보강
lee-sihun Aug 30, 2026
47da3c4
refactor: 숫자 입력 편집 세션 공용화
lee-sihun Aug 30, 2026
3a48c57
refactor: 오버레이 히트 플랫폼 구현 분리
lee-sihun Aug 30, 2026
fecea0e
test: 배치 노트 투명도 피커 계약 보강
lee-sihun Aug 30, 2026
9ffd61f
refactor: 배치 색상 피커 표면 분리
lee-sihun Aug 30, 2026
511ef16
test: 플러그인 인스턴스 설정 모달 계약 보강
lee-sihun Aug 30, 2026
f32a3cf
refactor: 플러그인 인스턴스 설정 모달 분리
lee-sihun Aug 30, 2026
57a37b1
test: 카운터 모션 미리보기 계약 보강
lee-sihun Aug 30, 2026
bf66ca7
refactor: 카운터 모션 미리보기 무대 분리
lee-sihun Aug 30, 2026
722b5b9
refactor: 앱 네이티브 창 구현 분리
lee-sihun Aug 30, 2026
7d4f2c4
test: 카운터 런타임 종료 경계 보강
lee-sihun Aug 30, 2026
ef3fe37
test: 노브 기본 테두리 컨텍스트 계약 보강
lee-sihun Aug 30, 2026
0a09cf6
test: 색상 피커 입력 세션 계약 보강
lee-sihun Aug 30, 2026
1ca122f
refactor: 색상 피커 입력 세션 분리
lee-sihun Aug 30, 2026
7027484
refactor: 설정 플러그인 생명주기 제어 분리
lee-sihun Aug 30, 2026
b94395e
refactor: 에디터 의미 패치 투영 분리
lee-sihun Aug 30, 2026
e7e31ea
refactor: 에디터 속성 패치 적용 분리
lee-sihun Aug 30, 2026
dc6f451
refactor: 히스토리 테스트 모듈 분리
lee-sihun Aug 30, 2026
994f2e4
refactor: OBS 브리지 테스트 모듈 분리
lee-sihun Aug 30, 2026
a7812f8
refactor: 키 명령 테스트 모듈 분리
lee-sihun Aug 30, 2026
faeea85
refactor: 네이티브 요소 ID 테스트 모듈 분리
lee-sihun Aug 30, 2026
4dfe3ef
refactor: 에디터 요청 검증 모듈 분리
lee-sihun Aug 30, 2026
9ba4861
refactor: 편집 제스처 테스트 모듈 분리
lee-sihun Aug 30, 2026
606ad79
refactor: 카운터 모델 도메인 분리
lee-sihun Aug 30, 2026
0289124
refactor: 플러그인 상태 테스트 모듈 분리
lee-sihun Aug 30, 2026
c637f8f
refactor: 에디터 모델 테스트 모듈 분리
lee-sihun Aug 30, 2026
ad99059
refactor: CSS 명령 테스트 모듈 분리
lee-sihun Aug 30, 2026
daa276a
refactor: 미리보기 브로커 테스트 모듈 분리
lee-sihun Aug 30, 2026
b26f59b
refactor: 키보드 관리자 테스트 모듈 분리
lee-sihun Aug 30, 2026
756e1fd
refactor: 오버레이 히트 테스트 모듈 분리
lee-sihun Aug 30, 2026
30a9d06
refactor: 프리셋 명령 테스트 모듈 분리
lee-sihun Aug 30, 2026
c195fe5
refactor: 노트 설정 모델 도메인 분리
lee-sihun Aug 30, 2026
1b60245
refactor: 카운터 모션 커브 캔버스 분리
lee-sihun Aug 30, 2026
92eabc4
test: 플러그인 단독 제거 정산 계약 보강
lee-sihun Aug 30, 2026
eb06600
test: OBS 전송 경계 계약 보강
lee-sihun Aug 30, 2026
1bcd555
refactor: OBS 전송 프로토콜 분리
lee-sihun Aug 30, 2026
1de5c43
test: 그래디언트 축 드래그 경계 보강
lee-sihun Aug 30, 2026
3fbd4f9
refactor: 그래디언트 축 기하와 드래그 세션 분리
lee-sihun Aug 30, 2026
2a5f7c3
refactor: 그룹 리사이즈 계획과 세션 분리
lee-sihun Aug 30, 2026
ad3b89b
test: 마이그레이션 자산 경계 계약 보강
lee-sihun Aug 30, 2026
7a4200e
refactor: 마이그레이션 자산 처리 분리
lee-sihun Aug 30, 2026
79eee12
test: 의미 커밋 응답 불일치 계약 보강
lee-sihun Aug 30, 2026
2111e7b
refactor: 의미 커밋 시도 런타임 분리
lee-sihun Aug 30, 2026
2b9712f
test: 히스토리 스냅샷 대수 계약 보강
lee-sihun Aug 30, 2026
9c1d851
refactor: 히스토리 스냅샷 대수 분리
lee-sihun Aug 30, 2026
6cfdfce
test: 사운드 트림 재생 수명주기 보강
lee-sihun Aug 30, 2026
df0ebcf
refactor: 사운드 트림 재생 런타임 분리
lee-sihun Aug 30, 2026
0301512
test: 레이어 선택 상호작용 계약 보강
lee-sihun Aug 30, 2026
f852fd7
refactor: 레이어 선택 의도 계산 분리
lee-sihun Aug 30, 2026
a506af4
test: 요소 위치 모델 직렬화 계약 보강
lee-sihun Aug 30, 2026
f26663f
refactor: 요소 위치 모델 도메인 분리
lee-sihun Aug 30, 2026
51663ce
test: 키 통계 카운터 표면 계약 보강
lee-sihun Aug 30, 2026
37a2ec7
refactor: 키 통계 카운터 프리뷰 공용화
lee-sihun Aug 30, 2026
d8cb44f
test: OBS 미디어 요청 경계 계약 보강
lee-sihun Aug 30, 2026
c314cdd
refactor: OBS 미디어 서빙 경계 분리
lee-sihun Aug 30, 2026
f318102
test: OBS 미디어 파일 정책 계약 보강
lee-sihun Aug 30, 2026
a4d2523
test: 키 슬롯 정규화 계약 보강
lee-sihun Aug 30, 2026
8e1b366
refactor: 키 슬롯 모델 도메인 분리
lee-sihun Aug 30, 2026
edf0f72
test: OBS RPC 승인 경계 계약 보강
lee-sihun Aug 30, 2026
f5773ba
refactor: OBS RPC 투영 경계 분리
lee-sihun Aug 30, 2026
577a143
test: OBS RPC 투영 계약 보강
lee-sihun Aug 30, 2026
f9eca3a
test: 카운터 모션 캔버스 세션 계약 보강
lee-sihun Aug 30, 2026
80f3e93
refactor: 카운터 모션 캔버스 세션 분리
lee-sihun Aug 30, 2026
614af8a
test: 프론트 플러시 핸드셰이크 계약 보강
lee-sihun Aug 30, 2026
1b6a7f5
refactor: 프론트 플러시 핸드셰이크 분리
lee-sihun Aug 30, 2026
bba4d15
test: OBS WebSocket 세션 순서 보강
lee-sihun Aug 30, 2026
6aebcf2
refactor: OBS WebSocket 세션 투영 분리
lee-sihun Aug 30, 2026
79c5c0b
test: OBS WebSocket 투영 계약 보강
lee-sihun Aug 30, 2026
d26a65c
test: 플러그인 설정 폼 수명주기 보강
lee-sihun Aug 30, 2026
f9902d6
refactor: 플러그인 설정 폼 빌더 공용화
lee-sihun Aug 30, 2026
ab318df
test: 요소 속성 패치 계약 보강
lee-sihun Aug 30, 2026
087c357
refactor: 요소 속성 패치 경계 분리
lee-sihun Aug 30, 2026
e178a1b
test: 에디터 제한 오류 우선순위 보강
lee-sihun Aug 30, 2026
00a4213
refactor: 에디터 제한 검증 경계 분리
lee-sihun Aug 30, 2026
42b6579
test: 사운드 트림 파형 세션 계약 보강
lee-sihun Aug 30, 2026
d549eaa
refactor: 사운드 트림 파형 세션 분리
lee-sihun Aug 30, 2026
e4578a8
refactor: 네이티브 요소 v1 어댑터 분리
lee-sihun Aug 30, 2026
d2989ac
test: 플러그인 요소 측정 수명주기 보강
lee-sihun Aug 30, 2026
bd42e00
refactor: 플러그인 요소 측정 런타임 분리
lee-sihun Aug 30, 2026
5bec6dd
test: 마이그레이션 정규화 수렴 계약 보강
lee-sihun Aug 30, 2026
cdc85f5
refactor: 마이그레이션 정규화 경계 분리
lee-sihun Aug 30, 2026
2ed0cf7
test: 프로퍼티 입력 파사드 계약 보강
lee-sihun Aug 30, 2026
0cf5303
refactor: 프로퍼티 입력 컴포넌트 분리
lee-sihun Aug 30, 2026
050965a
test: 프리셋 위치 검증 우선순위 보강
lee-sihun Aug 30, 2026
c857217
refactor: 프리셋 로드 검증 경계 분리
lee-sihun Aug 30, 2026
b988664
test: OBS 설정 컨트롤러 계약 보강
lee-sihun Aug 30, 2026
2c510aa
refactor: OBS 설정 컨트롤러 분리
lee-sihun Aug 30, 2026
13a3ee5
test: 사운드 자산 복구 오류 계약 보강
lee-sihun Aug 30, 2026
462acf4
refactor: 사운드 자산 복구와 격리 분리
lee-sihun Aug 30, 2026
5979ebb
refactor: 에디터 구조 연산 경계 분리
lee-sihun Aug 30, 2026
dd2dacc
refactor: 플러그인 인스턴스 스냅샷 적용 분리
lee-sihun Aug 30, 2026
fc3f433
refactor: 요소 스타일 연산 경계 분리
lee-sihun Aug 30, 2026
3fcea24
refactor: CSS 가져오기 네트워크 경계 분리
lee-sihun Aug 30, 2026
4dedaee
refactor: 플러그인 인스턴스 영속 런타임 분리
lee-sihun Aug 30, 2026
e0710fc
refactor: 의미 요소 속성 투영기 분리
lee-sihun Aug 30, 2026
80d3d81
refactor: 에디터 문서 위반 검증 경계 분리
lee-sihun Aug 30, 2026
6f0c804
test: 단일 패널 이름 변경 계약 보강
lee-sihun Aug 30, 2026
1a3f2c7
refactor: 단일 패널 이름 변경 헤더 공용화
lee-sihun Aug 30, 2026
f17ccc4
refactor: 패널 창 위치 저장 경계 분리
lee-sihun Aug 30, 2026
b0dfc78
test: 배치 패널 이름 변경 계약 보강
lee-sihun Aug 30, 2026
0866ccf
refactor: 패널 이름 변경 컨트롤 공용화
lee-sihun Aug 30, 2026
cb948a2
test: 오버레이 네이티브 메뉴 계약 보강
lee-sihun Aug 30, 2026
8cddb23
refactor: 오버레이 컨텍스트 메뉴 런타임 분리
lee-sihun Aug 30, 2026
3b13c3c
test: 레이어 이름 변경 입력 계약 보강
lee-sihun Aug 30, 2026
d5900d0
refactor: 레이어 이름 변경 입력 공용화
lee-sihun Aug 30, 2026
c06f5eb
test: 오버레이 리사이즈 앵커 큐 계약 보강
lee-sihun Aug 30, 2026
3cab0c0
refactor: 오버레이 리사이즈 앵커 제어 분리
lee-sihun Aug 30, 2026
0623450
test: 사운드 선택기 라이브러리 런타임 계약 보강
lee-sihun Aug 30, 2026
a4ace27
refactor: 사운드 선택기 라이브러리 런타임 분리
lee-sihun Aug 30, 2026
0588ca5
refactor: 사용자 CSS 스코프 변환 경계 분리
lee-sihun Aug 30, 2026
2d10950
refactor: 목록 팝업 메뉴 행 런타임 분리
lee-sihun Aug 30, 2026
b1a99de
test: 스마트 가이드 정렬 알고리즘 계약 보강
lee-sihun Aug 30, 2026
d6da908
refactor: 스마트 가이드 알고리즘 경계 분리
lee-sihun Aug 30, 2026
cb39221
test: 드롭다운 런타임 계약 보강
lee-sihun Aug 30, 2026
2171196
refactor: 드롭다운 런타임 경계 분리
lee-sihun Aug 30, 2026
c65e1c5
test: 플로팅 팝업 닫힘 정책 계약 보강
lee-sihun Aug 30, 2026
6b8ce26
refactor: 플로팅 팝업 닫힘 런타임 분리
lee-sihun Aug 30, 2026
760b45f
test: 배치 키 계열 커밋 실패 계약 보강
lee-sihun Aug 30, 2026
90b450e
refactor: 배치 키 계열 커밋 런타임 분리
lee-sihun Aug 30, 2026
edf588b
test: 레이어 액션 메뉴 계약 보강
lee-sihun Aug 30, 2026
995ad6c
refactor: 레이어 액션과 컨텍스트 메뉴 경계 분리
lee-sihun Aug 30, 2026
d428bab
docs: 코드 품질 리팩터링 결과 최신화
lee-sihun Aug 30, 2026
b85bfa7
merge: 최신 main 변경과 좌표 런타임 분리 통합
lee-sihun Aug 31, 2026
c0adc16
fix: Windows 모듈 분리 가시성 정리
lee-sihun Aug 31, 2026
5c59f10
fix: Windows Clippy 게이트 경고 정리
lee-sihun Aug 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
57 changes: 57 additions & 0 deletions .github/workflows/ci-windows-asio.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: Windows ASIO CI

on:
pull_request:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: windows-asio-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
asio-check:
name: ASIO 컴파일·정책 테스트
runs-on: windows-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false

- uses: dtolnay/rust-toolchain@4360b52568e2003a75bf9bc1d59f33a8e3fc893c # stable, 2026-08-05
with:
toolchain: stable
components: clippy,rustfmt

- uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri -> target
cache-on-failure: true

- name: Windows 빌드 도구 확인
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$llvmBin = Join-Path $env:ProgramFiles 'LLVM\bin'
$libclang = Join-Path $llvmBin 'libclang.dll'
if (-not (Test-Path -LiteralPath $libclang -PathType Leaf)) {
throw "libclang.dll을 찾을 수 없습니다: $libclang"
}
"LIBCLANG_PATH=$llvmBin" >> $env:GITHUB_ENV
rustc --version
cargo --version

- name: Rust 포맷 검사
run: cargo fmt --manifest-path src-tauri/Cargo.toml -- --check

- name: ASIO feature 컴파일 검사
run: cargo check --manifest-path src-tauri/Cargo.toml --features asio-backend

- name: ASIO feature Clippy 검사
run: cargo clippy --manifest-path src-tauri/Cargo.toml --all-targets --features asio-backend -- -D warnings

- name: ASIO 오디오 정책 테스트
run: cargo test --manifest-path src-tauri/Cargo.toml --features asio-backend audio::engine --lib
3 changes: 3 additions & 0 deletions .github/workflows/release-windows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,9 @@ jobs:

- run: npm ci

- name: Windows ASIO 출력 정책 테스트
run: cargo test --manifest-path src-tauri/Cargo.toml --features asio-backend audio::engine --lib

# 자동 업데이트 자산과 포터블 ZIP이 공유할 raw EXE를 한 번만 빌드
- name: Windows x64 빌드
run: npm run tauri:build -- --no-bundle
Expand Down
185 changes: 185 additions & 0 deletions docs/code-quality-refactoring-plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
# 코드 품질 리팩터링 결과와 후속 계획

## 목표와 판정 원칙

리팩터링 기준 커밋은 `af1bc19c`이며 작업 브랜치는 `refactor/code-quality-modularization`이다. 최종 검증 기준선은 2.0.2 태그를 포함한 `origin/main`의 `4b4d6c22`다. 이번 작업의 최우선 조건은 **의도한 동작 변경이 없는 책임 분리**와 **작업 중 추가된 선행 변경의 완전한 수용**이다.

- UI, 상태·비동기 runtime, 순수 변환 모델을 변경 이유와 검증 경계에 맞춰 분리한다.
- 공개 import, Tauri command/event, 저장 schema, editor wire 형식을 유지한다.
- characterization test로 기존 호출 순서, 오류 전파, preview/commit, cleanup 계약을 먼저 고정한다.
- 테스트와 리팩터링을 단계별 한국어 conventional commit으로 남긴다.
- 줄 수만 줄이는 분리나 내부 상태를 넓은 props/API로 노출하는 분리는 하지 않는다.
- 기존 결함은 리팩터링에 섞어 고치지 않고 별도 후속 작업으로 기록한다.
- 완전 동일성은 자동 검증 범위에서 엄격히 확인하되, 실제 Windows ASIO 장치와 Tauri WebView 같은 플랫폼 경계는 수동 smoke test가 별도로 필요하다고 명시한다.

## 브랜치 결과 요약

본 리팩터링 이력은 코드·테스트 242개와 이 결과 문서 1개를 포함해 총 243개 단계별 커밋으로 구성했다. 중간 수정 커밋 11개는 원인을 도입한 커밋에 흡수했고, rewrite 전 트리는 `backup/refactor-code-quality-pre-fixup-20260830`에 보존했다. rewrite 전후 코드 tree hash는 모두 `73d4dfccf034bc9e7290ebf978b956e4082c110a`로 동일하다. 최종 `main` 통합 전 상태는 `backup/refactor-code-quality-pre-main-sync-20260831`에도 별도로 보존했다.

리팩터링 자체는 공개 API를 바꾸지 않는다. 최신 `main`이 추가한 탭 rename·reorder와 패널 native drag command를 포함해 현재 Tauri command는 `origin/main`과 동일한 150개이며, `src-tauri/permissions`, 생성 schema, `docs/content`에도 `origin/main` 대비 차이가 없다.

## 최신 main 통합 결과

기준 커밋 이후 `origin/main`에 추가된 33개 커밋을 마지막 검증 전에 병합했다. 물리 좌표 기반 패널 drag·overlay 복원, 탭 이름 변경·순서·bar count, pointer 입력 시 초기 focus 정책, gooey·motion 정책, 2.0.2 release 문서와 설정을 모두 유지했다.

- 충돌 13개 파일은 기존 façade를 유지하면서 최신 구현을 추출 모듈에 이식했다.
- 최신 `main`에서 추가된 Rust 함수와 테스트 이름을 전체 대조했고 누락은 0개였다.
- 새 좌표 알고리즘이 한 파일에 다시 집중되지 않도록 `window_geometry.rs` 505줄과 `window_geometry/overlay_placement.rs` 902줄로 분리했다.
- 새 패널 drag 구현도 `panel_drag.rs` 1006줄, Windows native 어댑터 1075줄, 테스트 407줄로 분리했다.
- 저장된 `tabOrder`·`barCount`·native overlay 좌표를 migration, history, preset, bootstrap에 함께 반영해 원자적 복원 계약을 유지했다.
- pointer 기반 popup/dropdown 진입은 focus 복원을 생략하고 keyboard 진입은 기존 focus 계약을 유지한다.

아래 줄 수는 기준 커밋과 현재 파일을 `wc -l`로 직접 측정한 값이다. 현재 값은 추출된 하위 모듈을 제외한 façade 또는 상위 조립 파일의 크기다.

### 프론트엔드

| 파일 | 기준 | 현재 | 완료한 책임 경계 |
| --------------------------------- | ---: | ---: | ------------------------------------------------------------------ |
| `PropertiesPanel.tsx` | 3407 | 1199 | 선택 route, commit/runtime, plugin 설정, rename, layer action 분리 |
| `BatchSelectionPanel.tsx` | 2367 | 668 | 타입별 섹션, 공통 graph/knob, key-like commit runtime 분리 |
| `SingleSelectionPanel.tsx` | 2061 | 646 | 타입별 패널과 표시 모델 분리 |
| `Settings.tsx` | 1423 | 793 | 오디오 출력, 비동기 적용 큐, resize anchor controller 분리 |
| `Grid.tsx` | 2303 | 1269 | 네이티브 장면, 선택 overlay, context/ghost 모델 분리 |
| `useGridSelection.ts` | 1552 | 494 | drag, movement, clipboard, paste, guide 모델 분리 |
| `PluginElement.tsx` | 1647 | 686 | DOM adapter, layout, snapshot·persistence runtime 분리 |
| `editorCoordinator.ts` | 3001 | 1784 | queue, retry, semantic projection, violation 처리 분리 |
| `elementOps.ts` | 2611 | 571 | document/property/group/style/geometry 모듈과 façade 분리 |
| `ColorPicker.tsx` | 1513 | 611 | 입력, palette/history, surface runtime 분리 |
| `NumberInput.tsx` | 1440 | 226 | draft/parser, scrub·keyboard session, chrome 분리 |
| `CounterAnimationEditorModal.tsx` | 1417 | 371 | draft/model, curve canvas, preview session 분리 |
| `SoundTrimModal.tsx` | 1275 | 632 | decode, waveform, trim/export 모델 분리 |

추가로 `scopeUserCss.ts`는 212줄 façade, `smartGuides.ts`는 22줄 façade, `Dropdown.tsx`는 127줄, `ListPopup.tsx`는 168줄, `useLayerActions.ts`는 13줄 façade가 됐다. CSS selector/registry, 팝업 dismissal, 사운드 선택기 cache/runtime, editor structural/violation, plugin snapshot/persistence, window geometry persistence를 각각 독립 경계로 분리했다.

### 백엔드

| 파일 | 기준 | 현재 | 완료한 책임 경계 |
| ------------------------- | ----: | ---: | --------------------------------------------------------------------- |
| `state/store.rs` | 22978 | 829 | persistence, writer, recovery, asset, editor, plugin transaction 분리 |
| `state/editor_ops.rs` | 10154 | 49 | 연산군·검증·structural operation과 테스트 분리 |
| `state/migration.rs` | 6053 | 275 | 복구·migration 도메인과 테스트 분리 |
| `state/editor.rs` | 5777 | 176 | editor 상태·요청·테스트 분리 |
| `state/app_state.rs` | 9314 | 1259 | 창 geometry, keyboard, shutdown, controller 경계 분리 |
| `models/mod.rs` | 4169 | 860 | editor와 도메인 모델 분리 |
| `commands/preset/load.rs` | 3104 | 975 | font/image/sound 복원과 테스트 분리 |
| `commands/keys/sound.rs` | 2189 | 806 | library scan, repair, WAV 교체, 테스트 분리 |
| `audio/engine.rs` | 1788 | 911 | ASIO, decode, output test, command thread 분리 |
| `state/history.rs` | 2101 | 690 | snapshot/admission/transaction 경계 분리 |
| `services/obs_bridge.rs` | 1975 | 837 | 세션·메시지·forwarding 경계 분리 |
| `commands/keys/keys.rs` | 2177 | 1007 | mapping, custom tab, import/export 경계 분리 |

store 분리에서도 다음 불변식은 그대로 유지했다.

- orphan 자산은 직접 삭제하지 않고 `trash/<세션>/`에서 30일 격리
- store 복구가 발생한 세션은 asset sweep 생략
- 파일 자산 참조 수집과 손상·크래시 복구의 교차 검증 유지
- `keys[mode][i]`와 `keyPositions[mode][i]`의 인덱스 결합 유지
- writer와 추출 모듈이 기존 lock·commit 경계를 우회하지 않음

## Grid·프로퍼티 패널 재사용성 결과

키·통계·그래프·노브를 Grid와 overlay, single/batch panel 사이에서 다시 대조했고, 실제 DOM이나 정책이 같은 부분만 공용화했다.

- `KeyElementFace`: 키·통계의 placeholder, border, image/error, label, inside counter 표면
- `CounterPreviewBody` / `CounterPreviewLayer`: 키·통계 외부 카운터의 공통 body와 layer
- `GraphPanel`: Grid/overlay 그래프 표면
- `BatchGraphSettingsSection`: graph-only와 mixed 배치 설정
- `KnobFace`: 링, 이미지, indicator 표면
- `PanelRenameControl`: 단일·배치 이름 변경 header와 focus/select 순서
- `NativeGridElements`: 네이티브 요소 scene 조립과 adapter
- `nativeElementReferenceRegistry`: mount/unmount 시 ref 등록·삭제 계약
- `useGridElementInteraction`, stable handler slot, movement/clipboard/paste/smart-guide 모델: 포인터와 선택 정책

Graph 데이터 adapter, Knob 회전 상태, Key 활성 상태, Stat 정수 정규화처럼 의미가 다른 부분은 공용 컴포넌트의 조건문으로 합치지 않았다. 현재 `Grid.tsx`와 `PropertiesPanel.tsx`의 남은 대부분은 훅·route·props를 연결하는 상위 orchestration이다. 직접 테스트가 부족한 상태에서 더 분리하면 계약 면적과 회귀 위험이 커져 즉시 작업할 P0–P2 후보로 보지 않는다.

## ASIO 보강 결과

`audio/engine/asio.rs`에서 하드웨어 독립 정책과 장치 I/O 경계를 분리했다. 버퍼 프레임 정규화, 드라이버 목록 정렬·중복 제거, 출력 구성, build availability, 오류 코드와 fallback을 자동 검증한다.

- Rust ASIO focused suite: 18개 통과
- 프론트엔드 ASIO 설정 계약: 7개 통과
- `.github/workflows/ci-windows-asio.yml`: pull request와 수동 실행에서 fmt, feature check, Clippy `-D warnings`, focused test 실행
- Windows release workflow: production build 전에 ASIO focused test 실행

실제 ASIO 드라이버 열기, 다른 앱의 장치 점유, 재시작 후 장치 복원은 Windows 실제 장치 smoke test로 남는다. macOS의 Windows cross target은 로컬 MSVC CRT header가 없어 프로젝트 코드 전에 중단되므로 이를 대체하지 않는다.

## 검증 결과

단계별 focused suite와 독립 서브에이전트 감사를 반복했고, 최종 코드 트리에서 다음 결과를 확인했다.

- TypeScript type check 통과
- ESLint 오류·경고 0
- Prettier check 통과
- 전체 Vitest: 372개 파일, 3596개 테스트 통과, 18개 skip
- Vite production build 통과; 기존 대형 chunk 경고만 유지
- Rust 전체: 1044개 통과, 6개 ignored
- Rust fmt, all-target check, Clippy `-D warnings` 통과
- ASIO feature check·Clippy와 focused 18개 테스트 통과
- 최신 `main` 추가 Rust 함수·테스트 이름 대조에서 누락 0개
- 최종 병합 tree `git diff --check` 통과
- Rust module 175개와 literal `include_str!` / `include_bytes!` 경로 확인

동작 동일성 판정에는 AST/토큰 정규화 비교, 공개 반환 객체와 hook/ref 선언 순서 비교, close/await/RAF/focus 순서 테스트, 오류 전파·rollback·preview/commit characterization을 함께 사용했다. 마지막 독립 감사와 최신 `main` 통합 후 그래프·파일 크기 재감사에서는 즉시 안전하고 고가치인 추가 P0–P2 회귀·분리 후보를 발견하지 못했다. 복잡도가 높은 native window·keyboard runtime은 실제 플랫폼 harness 없이 더 분리하면 호출 순서 회귀 위험이 커 별도 고위험 경계로 유지한다.

## 의도적으로 보존한 기존 결함

아래 항목은 이번 리팩터링에서 발견했지만 동작 변경을 섞지 않기 위해 고치지 않았다. 별도 bug-fix 브랜치에서 먼저 실패 테스트와 기대 동작을 합의해야 한다.

| 영역 | 기존 동작 |
| ---------------------------- | ------------------------------------------------------------------------------------ |
| `PluginElement` subscription | 비동기 key/rawKey 구독이 unmount 뒤 완료되면 cleanup 누락 가능 |
| `PluginElement` state | 같은 tick의 shallow `setState`가 서로 다른 leaf 하나를 잃을 수 있음 |
| `NativeGridElements` | type+index 기반 action이 reorder/delete 뒤 다른 요소를 가리키거나 실패할 수 있음 |
| main dialog / color picker | 기존 timer·ref 재진입 경계가 완전히 정산되지 않음 |
| `SoundTrimModal` | 열린 상태에서 직접 unmount하면 playback/pointer cleanup 계약이 없음 |
| counter animation preview | Escape/window blur 및 복수 preview press의 첫 release 동작이 기존대로 유지됨 |
| `useLayerDnD` | active drag 중 unmount 시 document listener, scheduler, body cursor 정산 계약이 없음 |

## 후속 작업 분류

### 선행 harness가 필요한 고위험 경계

- `WebGLTracksOGL` / `noteBuffer`: 실제 GPU resource 수명과 성능 회귀 harness
- `useNoteSystem`: fake clock 기반 timing·pool·subscription continuity 검증
- `editorCoordinator`: queue/rebase의 결정적 trace와 failure injection
- editor transition/migration recovery: property/fuzz와 오류 우선순위 검증
- OBS/Tauri window runtime: 실제 창·WebSocket·종료 timing 통합 테스트
- ASIO/audio와 Windows keyboard: 실제 Windows driver/device smoke test
- 위 표의 기존 결함: 기대 동작 결정 후 별도 수정

### 낮은 우선순위

- `listPopupMenuRows.tsx`, `registryRewrite.ts` 등은 더 나눌 수 있지만 내부 pointer/registry 상태를 새 API로 노출하는 비용이 더 큼
- `Grid.tsx`, `PropertiesPanel.tsx`의 추가 분리는 stable ID와 직접 orchestration test를 먼저 갖춘 뒤 재평가
- Vitest의 기존 React `act(...)`, mock DOM prop, CSS parser stderr는 실패와 구분되지만 회귀 로그의 신호 대 잡음비를 낮추므로 별도 테스트 위생 작업으로 정리
- cohesive wire schema와 단순 route table은 파일 크기만으로 분할하지 않음

## 재현 가능한 최종 게이트

```bash
npx tsc --noEmit
npm run lint
npm run format:check
npm test -- --reporter=dot
npm run build

cd src-tauri
cargo fmt --all -- --check
cargo check --all-targets
cargo clippy --all-targets -- -D warnings
cargo test --all-targets --quiet
cargo check --all-targets --features asio-backend
cargo clippy --all-targets --features asio-backend -- -D warnings
cargo test --lib --features asio-backend audio::engine
```

## 완료 판정

- 공개 API·저장 형식·command/event 집합에 의도한 변경 없음
- 2.0.2 기준 최신 `origin/main` 선행 변경과 command 150개를 누락 없이 통합
- 단계별 커밋과 focused/전체 검증 통과
- rewrite 전후 tree 동일성 확인 및 복구 branch 보존
- Grid 핵심 표면과 패널 반복 UI 공용화 완료
- 대형 프론트엔드·백엔드 파일의 고가치 책임 경계 분리 완료
- 마지막 독립 감사에서 즉시 진행할 추가 P0–P2 후보 없음
- 실제 장치·GPU·native window가 필요한 항목과 기존 결함은 검증 조건을 붙여 후속 범위로 보존
14 changes: 7 additions & 7 deletions src-tauri/src/app.rs
Original file line number Diff line number Diff line change
Expand Up @@ -282,13 +282,13 @@ pub fn run() {
commands::keys::keys::keys_set_counters,
commands::keys::keys::raw_input_subscribe,
commands::keys::keys::raw_input_unsubscribe,
commands::keys::keys::custom_tabs_list,
commands::keys::keys::custom_tabs_create,
commands::keys::keys::custom_tabs_rename,
commands::keys::keys::tabs_reorder,
commands::keys::keys::custom_tabs_delete,
commands::keys::keys::custom_tabs_select,
commands::keys::keys::custom_tabs_restore,
commands::keys::keys::custom_tabs::custom_tabs_list,
commands::keys::keys::custom_tabs::custom_tabs_create,
commands::keys::keys::custom_tabs::custom_tabs_rename,
commands::keys::keys::custom_tabs::tabs_reorder,
commands::keys::keys::custom_tabs::custom_tabs_delete,
commands::keys::keys::custom_tabs::custom_tabs_select,
commands::keys::keys::custom_tabs::custom_tabs_restore,
commands::keys::keys::layer_groups_get,
commands::keys::key_sound::key_sound_get_status,
commands::keys::key_sound::key_sound_set_enabled,
Expand Down
Loading
Loading