126 Commits

Author SHA1 Message Date
4d0bc5c7a7 Git 탭 끌어다 놓기 · 파일 비교 편집 칸 바탕색 (사용자 요청)
Git 탭에 폴더나 파일을 끌어다 놓으면 그 저장소를 연다. [폴더...] 와 같은 규칙을
PathUtil.RepositoryFolderFor 한 곳에 두었다 - 파일이면 그 폴더, 저장소 안이면
최상위, 저장소가 아니면 그 폴더 그대로(열기가 "저장소가 아니다" 를 알린다).
탭 전체에서 PreviewDrop 으로 받는다. 경로 칸 · 커밋 메시지 칸이 TextBox 라
파일 놓기를 먼저 먹고 버리는 문제를 폴더 비교(7차 E-2)에서 겪었다.
PathTest 6건을 먼저 넣어 실패 확인 -> 68건 통과. 흉내 낸 OLE 끌기는 이미 되는
폴더 비교 칸에도 들어가지 않아 도구 한계로 보고, 사용자가 직접 끌어다 놓아
확인했다(로그에 저장소 열기 두 번, 그 사이 단추 누름 없음).

파일 비교 편집 칸은 바탕이 없어 페이지 바탕(밝음 #F2F2F3 · 어두움 #23262B)이
비쳐 회색이었다. PaneBackgroundConverter 가 물려받은 글자색 밝기로 테마를 가려
밝음 #FAFAFA · 어두움 #252830 을 준다 - 후보를 실제 코드 색으로 그려 보여 주고
사용자가 골랐다. g11-pane 두 테마에서 빈 자리 화소로 확인.

하단 탭이 따라가지 않던 문제(폴더 비교 -> 두 번 눌러 파일 비교)는 공용 플랫폼
셸에서 고쳤다(MergeHub 코드 변경 없음, 기록만).

Agent: main (claude-opus-5-5)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 17:05:07 +09:00
b7ade6a800 12차 G-3 ~ G-8 · 알파/베타 전 정리 (사용자 지시로 한 번에 커밋)
G-3 "덩어리" 를 "구간" 으로 - 단추 [구간 반영] · [구간 왼쪽으로], 단축키 설명, 로그.
G-4 저장 형식 콤보 둘을 구별 - 원본 인코딩 유지 · 원본 줄바꿈 유지. 저장값은
    "원본 유지" 그대로(세션 보관본 7·8칸) - SaveChoice(Value, Label) 로 보이는 글만 가른다.
G-5 사내 문의처 받침값 - csproj <SupportContact> 를 실행 파일에 박는다(문구는 아직 비움).
G-6 설정 > 개발자 정보. 담당 카드는 Platform 최민영 대리 · MergeHub 김승준 사원,
    소개 문구는 "사내 Merge/Diff + Git 도구"(Merge 먼저 - 창 제목 · csproj · 정보 창).
G-7 Alt+Down 화면 잘림 - 가운데 맞추기의 두 번째 스크롤이 메아리 막기에 걸려 버려졌다.
    CenterCharInView 가 다른 칸을 직접 맞춘다(g7-verify 고치기 전 10건 실패 -> 0).
G-8 메모 문법 강조 · 같은 글 칠하기 · 색 마킹(Ctrl+1~5) · 위치 막대. 투명 TextBox +
    아래층(사용자 결정). 화면에서 찾은 셋: 플랫폼 TextBox 스타일이 아래층을 덮음
    (Style={x:Null}), 콤보에 형 이름(LanguageProfile.ToString), 어두운 테마에서 메모 탭 ·
    문서 탭 제목이 검정(ItemContainerStyle 에 Foreground).

마무리(사용자 지시)
- 설정의 "프로그램 정보" 칸(만든 사람 · 사내 문의처)을 뺐다. [정보] 창은 실행 파일 값만.
- 주석 남기기가 켜져 있는데 작성자가 비면 반영 명령 맨 앞에서 알리고 반영하지 않는다
  (예전에는 git 이름 · 윈도우 계정으로 조용히 채웠다). 주석을 끄면 묻지 않는다.
- 데모(설정 두 칸 · [데모 ->] 단추 · 전환 코드)를 걷어냈다.

시험: 빌드 경고 0 · 오류 0. 하네스 MemoHlTest 45 · MemoTest 69 · OverviewTest 15 ·
AboutTest 30 · NoteTest 99. 화면 최종 회귀 22벌 423건(실패 4건은 대본이 툴팁을
읽은 것 - 고쳐 통과), 마무리 뒤 g5 · g6 · g9-author 실패 0. 한 번 나오고 재현 안 된
g8 가로 스크롤 항목은 12차 기록에 "값으로 확정 못 함" 으로 남겼다.

Agent: main (claude-opus-5-5)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 16:32:42 +09:00
a86dc1596f 12차 G-2 - base 칸으로 머지하는 단축키 (사용자 요청)
12차 B-1 로 왼쪽 파일로 반영하는 길([<] · TakeLineToBase)이 생겼는데 단축키가
없었다. 덩어리를 왼쪽으로 보내는 것은 명령 자체가 없었다 - AcceptBlock
(Alt+Shift+Right)은 오른쪽으로만 간다.

키를 어디에 둘지

사용자가 "Alt+Left 도 비어 있지 않냐" 고 물었다. 비어 있지 않았다 -
CopyRightToLeft 가 쓰고 있었는데, 2-Way 에서 그것이 하는 일은 이름·화살표와
달리 "이 줄 되돌리기" 였다. 그런데 이름이 가리키는 "왼쪽으로 반영" 이 B-1 로
실제로 생겼다. 그래서 감각이 맞는 쪽으로 넘겼다(사용자 결정).

  Alt+Right        한 줄 오른쪽으로        그대로
  Alt+Shift+Right  덩어리 오른쪽으로       그대로
  Alt+Left         이 줄 되돌리기      ->  한 줄 왼쪽 파일로
  Alt+Shift+Left   (없음)              ->  덩어리 왼쪽 파일로 (새로 만듦)
  이 줄 되돌리기   Alt+Left            ->  단축키 없음, Ctrl+Z 만

Alt+Right 가 이미 2-Way/3-Way 로 갈라져 있으므로 Alt+Left 도 같은 식으로
갈랐다. 3-Way(Take Theirs)는 안 건드렸다.

만든 것
- AcceptBlockToBase · ApplyGroupToBase - AcceptBlock/ApplyGroup 의 거울.
  주석은 덩어리 첫 줄 위 한 줄, 되돌리기는 한 번에(11차 F-2 와 같은 규칙).
  덩어리를 잡는 BlockAround 는 2-Way 에서 이미 CanTakeBase 로 잡으므로
  그대로 썼다 - 가져올 수 있는 줄과 보낼 수 있는 줄이 같은 줄이고 방향만 반대다.
- [이 덩어리 왼쪽으로] 단추 - [이 덩어리 반영] 옆에. 두 파일 비교에서만 뜬다.
  단축키만 두면 찾을 길이 없다.

겪은 것
- RaiseCanExecuteChanged 와 OnCaretRowChanged 에 새 명령을 안 넣어 단추가
  꺼진 채였다. CommunityToolkit 커맨드는 CommandManager 를 구독하지 않는다.
- 덩어리 명령은 고른 줄이 아니라 CaretRow(편집기 캐럿)를 본다. 시험이 목록을
  고르기만 해서 한 줄만 갔다 - Alt+Down 으로 캐럿을 놓아야 했다.

확인
- 화면 g2-verify 21건 실패 0 (연속 세 줄이 다른 재료를 따로 만들어 씀)
  Alt+Left 는 한 줄만, Ctrl+Z 로 되돌아가고, 덩어리는 셋이 한 번에 가고
  한 번에 돌아온다
- 하네스 ShortcutTest 88 -> 101건 (키 겹침 없음, 화살표 넷의 모양이 맞음,
  충돌 이동을 안 빼앗음, Alt+Left 설명이 "되돌리기" 라고 거짓말하지 않음)
- 회귀 g1 · e2 · e3 · e4 실패 0, 빌드 경고 0 · 오류 0

값으로 확정하지 못한 것: Alt+Shift 조합을 흉내 낸 키로는 못 눌렀다. 윈도우가
입력 언어 전환으로 먼저 채간다 - SendKeys 로는 아예 안 닿고 keybd_event 로는
Shift 가 빠져 Alt+Left 처럼 동작했다. 기존 Alt+Shift+Right 로 견줘 봐도 같아
시험 도구 한계다(C-3 의 DragMove 와 같은 부류). 그래서 덩어리는 같은 명령을
부르는 단추로 확인했다. 사람 손으로 한 번 눌러 보는 것이 남았다.

Agent: main (claude-opus-5)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-30 13:04:49 +09:00
b95a07d028 12차 G-1 - undo 가 계속 이어지던 것 (사용자 보고)
짝을 바꾼 뒤 Ctrl+Z 를 누르면 앞 파일 글(234자)과 지금 파일 글(228자)을
끝없이 오갔다. 40번을 눌러도 안 끝났고, 글자를 하나도 안 쳐도 났다.

Ctrl+Z 는 우리 목록(_undo · _textUndo)이 비면 일부러 키를 먹지 않는다
(RunShortcut - 그래야 편집기의 글자 되돌리기가 살아 있다는 뜻이었다).
그러면 그 키가 TextBox 자체 되돌리기로 넘어가는데, WPF 의 그것은 한도가
없고 프로그램이 코드로 넣은 글까지 기록한다. 그래서 짝을 바꿔 새 파일을
실으면 그 글도 기록에 쌓이고, Ctrl+Z 가 앞 파일 글을 편집기에 되살렸다.

거기서 끝이 아니었다. 되살아난 앞 파일 글을 Reflow 가 "사용자가 친 것"
으로 보고 모델을 그쪽으로 되돌리며 되돌리기에 다시 쌓고 다시하기를 지운다.
다음 Ctrl+Z 는 우리 목록으로 되돌리고, 그러면 또 TextBox 것이 되살린다.

기록을 심어 고리를 떴다:
  Sync 끝났다   편집기=228
  편집알림     편집기=234  모델=216
  Reflow      모델=216 편집기=221 같나=False
  StepText    목표=216 … 편집기=234
221 = 234 - 13(줄 13개의 CRLF/LF 차이)이라 편집기가 쥔 것이 앞 파일임을
값으로 확인했다.

고침은 한 줄이다 - LocalEditor 에 IsUndoEnabled="False". 되돌리기는 우리
목록만 쓴다(줄 단위 _undo, 글 단위 _textUndo).

확인
- g1-verify 14건 실패 0. 30번을 눌러도 길이 자취가 228 하나뿐
- 앞 파일(234자)은 자취에 한 번도 안 나온다
- 되돌리기 자체는 살아 있다 - 친 글은 Ctrl+Z 로 되돌아간다
- 회귀 e1 · e2 · e2-reg · e3 · e4 전부 실패 0
- 빌드 경고 0 · 오류 0

헛짚은 것 둘도 기록에 남겼다. "문서가 바뀔 때 TextBox 기록을 비우면 된다"
(EditorUndoGate 를 만들어 하네스 16건까지 붙였다)와 "재정렬 타이머가 되돌린
뒤 뒤늦게 터진다" 는 둘 다 증상이 안 없어져 되돌렸다. 검증 안 된 동작
변경은 남기지 않는다.

남은 것: 글자 한 자 단위 되돌리기는 없어졌다. 이제 한 걸음은 "타이핑이
멈춘 자리" 다. 쓰다가 너무 굵으면 _textUndo 를 더 잘게 쌓는 것으로 따로 잡는다.

Agent: main (claude-opus-5)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-30 12:45:19 +09:00
177c7ae8e7 플랫폼을 공용 저장소로 합친 기록 - 회귀 208건 실패 0
우리가 따로 쓰던 플랫폼 소스(D:\Sorce\ubsrepo, 원격이 Ubisam-MergeTool 이었다)에
얹어 둔 두 커밋을 진짜 플랫폼 저장소 D:\Sorce\UbisamCommonPlatform 으로 옮겼다.
MergeHub 코드는 손대지 않았다 - 문서만 고친다.

6991dfd 이후 양쪽이 갈라져 있었다. 우리 2커밋(트레이 · 창 자리 기억 · 세 갈래
묻는 창 · 탭 줄 크기 · 헤더 접기) vs 공용 4커밋(우클릭 메뉴 테마 · 앱 아이콘 ·
업데이트 기본값 · HANDOFF). 소스 파일이 하나도 겹치지 않아 부딪힌 것은
changelog.md 한 군데뿐이었고, 양쪽 줄을 다 살려 날짜순으로 합쳤다.

공용 쪽에 빠져 있던 문서도 채웠다 - 가이드 8-5 에 헤더 접기, HANDOFF 5·6절에
우리 기능. C-3 은 플랫폼 changelog 에도 줄이 없었다.

빌드해 이 PC 의 D:\UbisamPlatform\bin 까지 반영했다(오류 0 · 경고 4). dist 는
손대지 않았으므로 사내 다른 PC 는 그대로다.

화면 회귀 아홉 벌 208건 실패 0 · 예외 0. MergeHub 재빌드 경고 0 · 오류 0 -
플랫폼 API 는 깨지지 않았다.

지난번에 적은 "204건" 은 c3-verify 를 21건으로 잘못 센 것이었다(실제 25건).
세 문서 모두 208 로 고쳤다.

값 하나는 확정하지 못했다 - 이 회귀에서 C-3 의 모듈 시작 자리가 144px -> 51px
대신 154px -> 61px 로 나왔다. 벌어드린 높이는 93px · 62 DIP 로 똑같고, 따로
돌리니 다시 144 -> 51 이 나왔다. 공용 쪽 네 커밋(암시적 스타일이 ContextMenu ·
MenuItem 뿐)과 뜨는 모드(mode-probe.ps1 로 재 보니 둘 다 144px)는 원인이
아니었다. 무엇이 10px 을 밀었는지는 끝까지 캐지 않았다.

Agent: main (claude-opus-5)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-30 10:05:23 +09:00
a8843d0477 12차 C-3 배포 뒤 화면 회귀 기록 - 아홉 벌 204건 실패 0
플랫폼을 바꿔 배포했으니 그 위에 얹혀 도는 12차 화면 시험을 전부 다시 돌렸다.
MergeHub 코드는 손대지 않았다 - 문서만 고친다.

f1 38 · d1 39 · e1 24 · e2 34 · e2-reg 18 · e2-start 8 · e3 16 · e4 6 · c3 21
= 204건, 실패 0 · 예외 0.

한 벌에 들어가기 전 앞 벌이 남긴 창과 보관함(D:\UbisamConfig\Memo ·
Session\MergeHub)을 치워 서로 섞이지 않게 했다(run-all-c3.ps1). 끝나고
MergeHubSettings.json · UiSettingsService.json · MergeHub.Recent.txt ·
ShellWindowPlacement.json 을 시작 기준본과 바이트까지 같게 되돌렸다.

여전히 사람 손이 필요한 것: 접은 C-3 띠를 끌면 창이 따라오는가.
흉내 낸 마우스로는 WPF DragMove 가 움직이지 않고, 예전부터 되던 기존 헤더
끌기로 견줘 봐도 같았다(시험 도구 한계).

Agent: main (claude-opus-5)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-30 09:32:45 +09:00
362eecc992 12차 C-3 기록 - 플랫폼 헤더 줄 접기 (배포함)
플랫폼 쪽 코드는 D:\Sorce\ubsrepo 에 따로 커밋했다. 여기에는 값과 판단을 남긴다.

- 재현: 헤더가 모듈 화면을 144px 아래로 밀고 있었고, 접는 길은 설정 화면 체크박스뿐,
  접으면 되살릴 띠도 단축키도 없었다
- 정한 것(사용자): 단축키 Ctrl+F11, 띠에는 화살표와 안내 글만(시계 · 이름은 빼고)
- 값: 모듈 시작 144px -> 51px (62 DIP 벌었다), 다시 켜도 접힌 채,
  F11 은 그대로 아래 탭 줄만
- 확정 못 한 것: 접은 띠를 끌면 창이 따라오는가 - 흉내 낸 마우스로는 WPF DragMove 가
  움직이지 않고 기존 헤더로 견줘 봐도 같았다(시험 도구 한계)
- 배포: 사용자 확인 뒤 빌드해서 바로 반영. 배포본은 bin-backup-c3 에 백업

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-28 17:04:05 +09:00
9bd27a1960 12차 F-1 - 하단 탭에 메모장
사용자가 정한 것: 메모 + 파일 열기 둘 다, 저장 단추 없이 계속 남는다,
이름은 "메모 1 · 메모 2" 번호만, 편집기는 줄 번호 · 글자 크기 · 줄바꿈 + 찾기/바꾸기.

무엇을 만들었나
- Services/Memos.cs: Memo(한 장) · MemoBook(번호 · 이름 · 넘기기 · 닫기, 계산만) ·
  MemoStore(보관, {설정 폴더}\Memo\)
- ViewModels/MemoViewModel.cs: 새 메모 · 파일 열기 · 저장 · 다른 이름으로 · 닫기 ·
  자동 보관(2초) · 켤 때 되살리기
- Views/MemoView.xaml(.cs): 동작 한 줄 · 메모 탭 줄 · 찾기/바꾸기 줄 · 줄 번호 편집기 · 상태 줄
- AppSetup: 하단 탭 맨 뒤에 넣었다 - 앞 세 탭의 차례가 바뀌면 손버릇도 바뀐다

정한 것
- 보관 자리는 {설정 폴더}\Memo\ - E-1 의 Session\ 과 따로. 저쪽은 "저장하면 사라지는 것",
  메모는 "지우기 전까지 남는 것"이라 수명이 다르다. 모양(목록 한 장 + 글마다 파일)은 같다
- 이름 없는 메모는 번호만. 첫 줄을 따오면 글을 고칠 때마다 탭 줄이 요동친다.
  번호는 비어 있는 가장 작은 수 - 메모 1 을 닫고 새로 만들면 다시 메모 1
- 파일로 연 메모와 이름 없는 메모를 한 탭 줄에 섞는다(notepad++ 와 같다)
- 탭 줄 · 저장 안 한 가운뎃점 · Ctrl+Tab · 가운데 단추 닫기는 12차 E-2 문서 탭과 같은 모양 -
  두 화면이 서로 다르게 움직이면 배우는 것이 둘이 된다
- 닫을 때 저장하지 않은 것이 있으면 세 갈래로 묻는다(사용자 결정) -
  저장하고 닫기 · 저장하지 않고 닫기 · 취소. 고친 것이 없으면 묻지 않는다.
  저장이 막히면(취소 · 쓰기 실패) 닫지 않는다
- 메모는 문서 탭과 달리 글을 스스로 들고 있다 - 메모는 원래 작은 글이고,
  이름 없는 메모에는 다시 읽어 올 파일 자체가 없다

화면을 보고 고친 세 가지(사용자 보고)
- 다른 탭에 갔다 오면 메모 글이 비어 보였다. 탭을 오가면 화면이 다시 만들어지는데
  그때 편집기가 잠깐 비어 있고, 그 틈에 글을 거두면 빈 글로 메모를 덮어썼다.
  편집기가 지금 어느 장을 싣고 있는지를 두고, 맞지 않으면 거두지 않게 했다
- 줄 번호와 글이 어긋났다. TextBlock 으로 그렸더니 줄 높이가 조금씩 달라 아래로 갈수록 벌어졌다.
  편집기와 같은 종류(TextBox)로 바꾸고 글꼴 · 크기 · 여백을 같은 값으로 두니 같은 자로 줄을 잰다
- 글이 칸 한가운데에서 시작했다. 플랫폼 입력 칸 스타일이 글 칸을 세로 가운데에 붙박아 둔다 -
  한 줄짜리 칸을 겨냥한 값이다. VerticalContentAlignment 로는 안 풀려 그 칸을 직접 늘렸다

확인
- 하네스 MemoTest 69건 새로 만듦. 전체 29벌 1,934건 · 실패 0. 빌드 경고 0 · 오류 0
- 화면 30건: 세 장 만들어 각각 쓰기 · 글 안 섞임 · 강제 종료 뒤 세 장이 차례 · 글 그대로 ·
  Ctrl+F 찾기 · 모두 바꾸기 3곳 · 닫을 때 세 갈래로 묻고 취소하면 그대로 · 빈 메모는 안 물음 ·
  40줄에서 줄 번호 40개가 글과 맞음 · 다른 탭 멀쩡
- 화면 여덟 벌(E-1 · E-2 · D-1 · 줄 번호 · 줄 밀림 · F-1) 모두 통과

시험 도구도 고쳤다: 스크립트가 변수 이름을 $keep 로 써서 라이브러리의 $Keep(되돌릴 설정 목록)을
덮어쓰는 바람에 시험이 끝나도 설정이 안 돌아왔다. 묻는 창을 찾는 도구도 단추 이름을
"저장하지 않고 계속" 로 못 박아 두어 말이 다른 창을 못 알아봤다 - 앞부분만 맞춰 보게 했다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-28 16:30:24 +09:00
b28db92515 12차 D-1 - 폴더 비교 위쪽을 한 줄로 · 옵션은 서랍으로
재현: 경로 · 옵션 · 찾기 · 색 범례가 네 줄로 305px(배율 150% 기준 203 DIP)를 먹었고,
비교하기 전에도 그대로였다. 자주 쓰는 [비교] 는 옵션 줄 끝에 묻혀 있었다.

위 한 줄
  [...] 왼쪽 경로  <->  [...] 오른쪽 경로  [최근 v]  켠 옵션  [비교] [취소] [옵션 v]

- 폴더 고르기는 글자 대신 ... 로. 경로 칸 바로 앞에 두어 어느 쪽 것인지 헷갈리지 않는다
- 좌우 바꾸기를 새로 넣었다(사용자 결정) - 반대로 견주려고 두 번 고르지 않아도 된다
- 최근 목록은 화살표만 남겼다

옵션 서랍
- 빠른 비교 · 하위 폴더 포함 · 보기 · 포함 · 제외를 [옵션 v] 안으로. [폴더 안 찾기] 도 여기에
- 서랍에 넣으면 "내가 뭘 켜 뒀더라" 를 알 수 없게 된다 - 특히 제외 규칙은 켠 줄 모르고
  "왜 이 파일이 안 보이지" 로 이어진다. 기본과 다른 것만 한 줄에 짧게 적는다(FolderOptionText).
  기본 그대로면 아무것도 적지 않는다 - 늘 떠 있는 글은 눈에 띄지 않는다

찾기 · 색 범례
- 찾기는 늘 한 줄을 먹던 것을 Ctrl+F 로 부를 때만 편다. Esc · [찾기 접기] 로 접는다
- 색 범례는 아래 상태 줄로 내렸다 - 색은 목록을 보는 동안 필요한 것이라 결과 요약 옆이 제자리다

화면으로 확인
- 위쪽 높이 305px -> 77px (203 -> 51 DIP, -75%)
- 좌우 바꾸기: 누르면 맞바뀌고 다시 누르면 되돌아온다
- 옵션 서랍에 넣은 것이 다 있고, 빠른 비교를 켜면 줄에 "빠른 비교", 제외 규칙이 있어 "규칙 1"
- Ctrl+F 로 77 -> 158px, Esc 로 다시 77px
- 비교 그대로 동작(전체 2개 · 다름 2 · 왼쪽만 0 · 오른쪽만 0 · 같음 0)
- 되던 것이 하나도 없어지지 않았다: 폴더 고르기 · 최근 · 빠른 비교 · 하위 폴더 · 보기 거르기 ·
  포함/제외 · 폴더 안 찾기 · 결과 내보내기 · 복사/삭제 · 줄 단위 비교 · 색 구분(아래로)
- 좁은 창(1920px = 1280 DIP)에서도 여전히 77px 한 줄, [비교] · [옵션] 다 보임

화면을 보고 고친 것: [옵션 v] 를 ToggleButton 으로 뒀더니 플랫폼 기본 스타일이 스위치 모양이라
같은 줄의 다른 단추와 따로 놀았다. 여느 단추로 바꿨다. 최근 목록도 폭을 못 박지 않아
넓게 벌어지던 것을 고쳤다.

하네스 FolderTest 118 -> 131건, 전체 28벌 1,865건 · 실패 0. 빌드 경고 0 · 오류 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-28 15:25:17 +09:00
101deb2627 12차 E-1 - 저장하지 않은 편집이 껐다 켜도 남는다 (notepad++ 식)
E-2 가 만든 보관함(탭이 사라져도 고친 글이 짝 이름으로 남는 자리)을 그대로 파일로
옮겨 적는 일이다. 새로 정할 것은 언제 쓰고 언제 되살리는가뿐이었다.

어디에 · 어떤 모양으로

  {설정 폴더}\Session\MergeHub\
      목록.txt        차례 · 짝 경로 · 캐럿 · 스크롤 · 저장 형식 · 보고 있던 탭 · 그때 파일의 자취
      01-오른쪽.txt    저장하지 않은 오른쪽 글(있을 때만)
      01-왼쪽.txt      저장하지 않은 왼쪽 글(12차 B-1, 있을 때만)

11차 F-9 백업과 다른 자리다 - 백업은 "저장하기 전 파일", 이것은 "저장하지 않은 편집" 이라
뜻도 수명도 다르다.

- JSON 을 쓰지 않는다(최근 목록과 같은 까닭). 사람이 열어 보고 고칠 수 있고, 무엇보다
  글 안에 무엇이 들었든(따옴표 · 줄바꿈 · 제어 문자) 본문을 따로 파일로 두면 탈이 없다
- 원본 글은 담지 않는다. 파일에서 다시 읽으면 되고, 담아 두면 그 사이 파일이 바뀌었을 때
  낡은 것을 보여 준다. 대신 그때 파일의 길이 · 마지막으로 쓴 때(FileStamp)만 적어 둔다
- 목록은 맨 나중에 쓴다 - 목록이 있다는 것이 곧 글 파일이 다 있다는 뜻이다
- 못 읽거나 못 써도 조용히 넘어간다. 보관 때문에 프로그램이 안 켜지면 안 된다

언제 쓰나

- 글자가 멈춘 뒤 2초에 한 번(DispatcherTimer)
- 탭을 옮길 때 · 닫을 때 · 새 짝을 열 때는 그 자리에서 바로 - 그 순간이 곧 끄기 직전일 수 있다
- 쓰는 일은 다른 실로 넘긴다(Task.Run). 화면 상태를 뜰 때 ParkCurrentTab 을 쓰지 않는다 -
  그쪽은 되돌리기 목록을 글 단위로 눌러 담는데, 2초마다 이력을 주무를 까닭이 없다.
  보관할 것은 글과 자리뿐이고 되돌리기 이력은 되살리지 않기로 정했다(사용자 결정)

언제 되살리나

켤 때 묻지 않고 그대로(사용자 결정). 다만 사용자가 지금 열라고 한 것이 먼저다 -
충돌 파일 열기 · git mergetool · 폴더 비교에서 고른 파일. 설정의 기본 저장소 · 기본 짝보다는 앞선다.
원본 글은 파일에서 다시 읽고 그 위에 편집을 얹는다(E-2 의 ResumePendingTab 그대로).
원본이 그 사이 바뀌었으면 되살리고 알린다 - "연 시점" 은 새로 읽은 글로 두어
[전체 되돌리기] 가 지금 파일로 가고, 고친 글은 편집으로 남는다.
두 파일이 다 없어진 짝은 되살릴 자리가 없으므로 버린다.

확인

하네스 SessionTest 65건 새로 만듦(글로 옮기고 되읽기 · 빈칸/한글/UNC 경로 ·
알아볼 수 없는 줄 건너뛰기 · 보관할 것 없으면 치우기 · 옛 글 파일 치우기 ·
글 파일이 없어져도 넘어가기 · FileStamp · 보관함 주고받기). 전체 28벌 1,852건 · 실패 0.

화면 24건: 두 짝을 고치고 작업 관리자로 끄듯 강제로 끝낸 뒤 다시 켜면 묻지 않고
탭 2개가 이름 · 차례 · 글 그대로 되살아나고, 한쪽을 저장하면 가운뎃점이 2->1,
둘 다 저장하면 보관본이 사라지고, 다시 켜면 되살릴 것이 없다.
원본이 그 사이 바뀌면 되살리고 "저장하면 바뀐 파일을 덮어씁니다" 를 알린다.

빠르기에 대해: 5,003줄(113KB) 짝에서 글자당 31ms 로 4줄짜리와 같았다(앱이 입력에 밀리지 않는다).
다만 "친 뒤 화면에 보이기까지" 는 값으로 확정하지 못했다 - 그것을 재려면 편집기 글을
UIA 로 읽어야 하는데 5,003줄 창에서는 그 읽기가 타이핑보다 훨씬 오래 걸려 값이 오염된다.
재는 법을 따로 마련해야 한다.

시험 도구: E-1 이 도니 지난 시험이 남긴 편집이 다음 시험에서 되살아나 화면이 달라졌다
(e3-verify 가 왼쪽 7줄 대신 14줄을 봤다). 시험마다 보관 자리를 치우고 시작해 끝에
되돌리도록 고쳤다 - 기능이 제대로 도는 증거이기도 하다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-28 14:53:23 +09:00
06d78e2fc7 [<] 단추가 있는 줄만 글이 밀리던 것 - 단추 자리를 늘 잡아 둔다
사용자가 그림으로 짚어 준 것. 12차 B-1 로 넣은 [<] 단추가 든 칸의 폭이 Auto 여서,
단추가 보이는 줄에서만 칸이 벌어져 뒤 칸이 통째로 오른쪽으로 밀렸다.
같은 칸 안에서도 줄마다 글이 시작하는 자리가 달랐다.

  BASE                          LOCAL
    01  class Axis                01  class Axis
  < 03      int speed = 100;      03 >     int speed = 200;   <- 밀림
  < 04      // left only line     05 > <     void Stop() { }  <- 더 밀림
    05  void Home() { }           06  }

BASE 는 [<] 가 맨 앞 칸이라 번호까지, LOCAL 은 번호 뒤 칸이라 코드가 밀렸고,
단추가 하나 늘 때마다 한 칸씩 더 밀렸다.

Visibility="Collapsed" 은 자리까지 없애므로, 자리를 지키려면 칸 폭이 고정이어야 한다.

- GutterBothWaysWidth 를 두어 BASE · LOCAL 이 같은 자리를 늘 잡아 둔다
- 화면이 모드에 따라 갈아 끼운다(ApplyGutterReserve) -
  두 파일 비교는 단추 폭, Git 모드와 네 칸은 0(그 단추가 아예 없다 - 여백이 예전 그대로)
- 투명한 편집기가 아래 표시층과 어긋나면 캐럿이 글자와 다른 자리에 선다 -
  EditorGutterMargin 도 같은 값만큼 민다
- 글자 크기(11차 F-5)를 바꾸면 단추 폭이 따라 바뀌므로, 잡아 두는 자리도
  CodeFontMetrics 한 벌에서 나온다

화면으로 확인: 한 칸의 모든 줄이 같은 x(BASE 137 · LOCAL 1283),
글자 크기를 키워도 한 x(147), Git 모드도 한 x(459). 오류 글 0.
E-2 화면 세 벌 · 왼쪽 번호 한 벌 모두 그대로 통과. 빌드 경고 0 · 오류 0.

남겨 둔 것: BASE 줄 끝의 [>](11차 F-10)는 아직 Auto 다. 왼쪽 가장자리를 밀지 않고
오른쪽에서 코드 칸을 조금 좁힐 뿐이라 눈에 띄지 않는다. 워드랩을 켜면 그 줄만
접히는 자리가 달라질 수 있다 - 워드랩은 기본이 꺼짐이라 이번에는 두었다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-28 14:09:52 +09:00
62126e5e0e 왼쪽 줄 번호가 밀리던 것 - 왼쪽도 다시 번호를 맨다
사용자 보고. 12차 B-1 로 왼쪽에도 반영할 수 있게 되면서 왼쪽 줄이 늘고 주는데,
번호는 정렬기가 처음 준 것 그대로였다. 오른쪽에만 있던 줄을 왼쪽에 넣으면
그 줄은 번호가 비고 뒤 줄은 옛 번호를 달아 01 02 (빈) 03 04 05 (빈) 06 으로 보였다.
왼쪽 파일은 8줄이 됐는데 번호는 6까지라 어느 줄을 고쳤는지 짚을 수 없었다.

MergeLine.BaseNumber 의 설명에는 이미 "이제 두 파일 비교에서는 번호도 따라 바뀐다" 고
적혀 있었지만 실제로 다시 매기는 자리가 없었다 - 적어 둔 뜻과 코드가 어긋나 있었다.

- RenumberBase 를 RenumberMerged(8차 B-3) 옆에 두고, 그릴 때마다 왼쪽에 있는 줄만 1부터 다시 맨다
- 두 파일 비교(BothWays)에서만. Git 모드 · 네 칸의 BASE 는 지난 커밋 · 공통 조상이라
  고칠 수 없고, 그때 번호는 그 파일의 번호이므로 건드리지 않는다
- "머지 반영함" 표시는 BASE 줄 번호를 열쇠로 붙들고 있다(_appliedBaseNumbers) -
  번호가 실제로 달라질 때만 그 열쇠도 옛 번호에서 새 번호로 옮겨 담는다.
  안 그러면 규칙을 한 번 건드리는 순간 엉뚱한 줄이 반영함으로 칠해진다

화면으로 확인: 연 직후 01..07, 두 줄 넣으면 01..09 로 이어짐, 되돌려도 이어짐,
왼쪽 저장하면 파일 9줄 = 칸의 끝 번호 09, Git 모드 회귀 그대로.
하네스 27벌 1,787건 · 실패 0. 빌드 경고 0 · 오류 0.

아직 확정하지 못한 것: 왼쪽에만 있는 줄을 [<] 로 뺄 때 왼쪽 줄 수가 하나 주는지.
따로 열어 한 번 누르면 잘 빠지는데(3줄 -> 2줄), 다른 반영을 몇 번 한 뒤에는
시험 도구가 읽은 줄 칸이 낡아 옆 줄 단추를 눌러 값이 흔들렸다.
번호 불변식(늘 1부터 이어지고 빠진 번호가 없다)은 어느 경우에도 지켜졌다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-28 13:58:46 +09:00
13988d1f0a 12차 - 폴더 비교 읽기 쉽게 · 양방향 머지 · 칸 요약 · 정보 창 · 문서 탭
새 플랫폼(UbisamBase.Launcher) 위로 옮기면서 12차 A~E 를 한 번에 담는다.
항목별 값과 판정은 doc/history/2026-09-23-12차.md, 요약은 doc/history/changelog.md.

A. 폴더 비교를 읽기 쉽게
- A-1 폴더 줄의 크기가 늘 0B 이던 것 - 안에 든 파일 크기 합계를 아래에서 위로 더해 적는다
  (걸러 낸 파일은 합계에서도 빠진다)
- A-2 좌우로 나눠 보이기 - 왼쪽 · 오른쪽 목록을 나란히 두고 같은 줄에 맞춘다.
  한쪽에만 있는 항목은 반대편을 비운다

B. 파일 비교 화면
- B-1 2-Way 에서 양쪽으로 머지 - 칸마다 반영 · 저장. 왼쪽 기준점을 따로 세고,
  되돌리기 · 저장 백업도 양쪽 모두
- B-2 프로그램 정보 창 - 버전 · 빌드 날짜 · 만든 사람 · 사내 문의처 · 플랫폼 버전 · 로그 폴더
- B-3 칸 아래에 무엇이 달라졌는지 - 칸마다 줄 수 · 추가 · 삭제 · 수정, 가운데에 진행

C. 플랫폼 (플랫폼 저장소에서 함께 나감)
- C-2 하단 탭 줄을 한 단계 작게 - 74 -> 61 DIP. 실측 133 -> 109px 이고
  그만큼 코드 칸이 늘어 파일 비교가 47 -> 48줄

E. 저장하지 않아도 남는 편집
- E-2 여러 짝을 동시에(문서 탭). 지금까지는 한 짝만 들어서 짝을 바꾸면
  저장하지 않은 편집을 묻고 버리면 사라졌다(재현: 16줄 -> 15줄).
  이제 떠 있던 탭이 그 글을 맡아 두므로 묻지 않는다.
  - 탭마다 HomeViewModel 을 따로 만들지 않았다 - 이 화면은 GitWorkspace 의 여러 사건과
    한 자리짜리 약속(ConfirmDiscardEdits · ConfirmLeaveCommit)에 물려 있다.
    화면은 하나로 두고 탭이 파일에 없는 것만 맡는다(고친 글 · 왼쪽 글 · 되돌리기 이력 ·
    두 기준점 · 캐럿 · 스크롤 · 저장 형식)
  - 탭 이름은 파일 이름, 다르면 왼 <-> 오. 양쪽이 같은 부분은 한 번만 적는다
    (WeldController_기준 <-> 내작업.cs, 421 -> 288px). 같은 이름이 겹치면
    갈릴 때까지 위 폴더를 한 겹씩 덧붙인다
  - 저장하지 않은 탭에 가운뎃점. 사람이 손댄 것만 센다 - 중괄호 맞춤으로만 바뀐 것은
    묻는 자리와 같은 기준으로 뺀다(안 그러면 .cs 를 여는 것만으로 늘 점이 붙는다)
  - 탭이 사라져도 고친 글은 보관함에 남아 다시 열면 되살아난다(짝 50개).
    E-1(껐다 켜도 남는 편집)은 이 보관함을 파일로 옮겨 적으면 된다
  - 이전 · 다음 파일은 지금 탭의 짝만 바꾸고, 폴더 비교에서 두 번 누르면 새 탭(사용자 결정)
  - Ctrl+Tab · Ctrl+Shift+Tab · Ctrl+W · 가운데 단추 닫기. 닫을 때도 묻지 않는다
  - Git 탭 · 병합 중 네 칸은 탭이 맡지 않는다 - 그쪽은 예전처럼 묻는다

하네스 27벌 1,787건 통과 · 실패 0(DocTabTest 106건 새로 만듦).
빌드 경고 0 · 오류 0. 화면으로 E-2 34건 · 회귀 19건 확인.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-28 13:21:54 +09:00
3c8d33f8be 11차 뒤 G-1 기록: 300% 모니터에서 최대화하면 오른쪽 넘침 (플랫폼 고치고 배포)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 09:55:11 +09:00
c99723181e 11차 F-11: Git 원격 URL · 계정 · 토큰 저장
- URL · 계정은 Git 탭에 적으면 설정에 남긴다(0.8초 모아 한 번)
- 토큰은 fetch/pull/push/클론이 성공했을 때만 윈도 자격 증명 관리자에(GitCredentialStore, 서버마다 한 이름)
- 켤 때 · 주소를 바꿀 때 그 서버 토큰만 가져오고, 다른 서버로 바꾸면 앞 서버 토큰은 치운다
- [토큰 지우기] 단추 · "저장됨" 표시, 인증 실패는 한글 안내(GitErrors.Friendly)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 02:42:25 +09:00
c317a7f70b 11차 F-10: 칸마다 자기 줄 · 바뀐 덩어리를 잇는 선 (Araxis 식)
- 정렬 행은 그대로 두고 칸마다 그 칸에 있는 줄만 걸러 보임(빈 줄로 맞추지 않음), 칸마다 자기 행 높이
- 편집기에서 빈 줄 없앰(StripFillers 삭제), 편집기 줄 <-> 정렬 행 표(EditorSnapshot.Rows)
- 스크롤은 가운데 기준으로 따라옴(PaneMapping), 차이 이동은 그 자리를 가운데로
- 틈에 바뀐 덩어리 사다리꼴 선 · 경계선 · 옮김 점선(PaneLinkOverlay), 3분할은 위 세 칸 사이
- 지운 줄 되살리기 [>] 는 BASE 칸 끝

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 21:54:39 +09:00
ce731c7b07 11차 F-9: 저장할 때 백업
- 설정 "저장할 때 백업"(기본 끔). 켜면 모든 저장 직전 지금 파일을 바이트 그대로 {설정 폴더}\Backup\MergeHub\날짜\... 로 복사(FileBackup)
- 두 파일 · mergetool · Save & Commit · 병합 중 Save · 파일 단위 Accept(IGitService.BeforeOverwrite) · 폴더 비교 복사
- 날짜 폴더마다 목록.txt, 저절로 지우지 않음, 못 만들면 저장하지 않음, ACTIONS [백업 폴더 열기]

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 21:13:59 +09:00
a9cbb50884 11차 F-8: 저장한 뒤에도 되돌리기 · 푼 파일을 다시 충돌로
- 저장할 것 있음을 되돌리기 목록이 아니라 "마지막 저장과 다른가" 로(SaveBaseline). 저장 · 저장 후 커밋은 목록을 둠
- 줄을 다시 세울 때(커밋 뒤 새 HEAD · 규칙 바꾸기 · 친 뒤 재정렬) 이력을 글 단위로 옮겨 지킴, 친 것도 한 걸음
- 전체 되돌리기는 파일을 연 시점, 저장했으면 화면만
- Git 탭 "이번 병합에서 푼 파일" + [다시 충돌로] (이 단추만 git checkout -m, 해결 기록에서 뺌)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 20:55:51 +09:00
3d0022a598 11차 F-7 기록: 플랫폼 배포함
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 18:47:14 +09:00
e08eaae2e6 11차 F-7 기록: 대형 모니터에서 오른쪽이 잘림 - 창 자리 되살리기(플랫폼)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 18:44:05 +09:00
ea35b718df 11차 F-6: 코드 칸 줄 간격 좁힘(줄 높이 글자의 1.67배 → 1.33배)
- 사용자 결정: 줄 간격만 줄이고 선택 사항(단추 · 설정)은 만들지 않음
- 12 → 16, 1920x1080 두 칸 40 → 50줄, 네 칸 17 · 18 → 22 · 23줄
- 북마크 표식 높이도 줄에 맞춤
- FontTest 144(1,572건), E-1 회귀 없음

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 18:32:50 +09:00
1895b11c8d 11차 F-5 뒤: 켜자마자 · 탭에서 돌아와도 단축키가 듣게(편집기 자동 포커스)
- 포커스가 비었거나 이 화면 밖이면 편집기로(화면 뜰 때 · 돌아올 때 · 창 활성)
- 화면 안(찾기 칸 등) · 다른 창의 포커스는 그대로
- E-1 병합 길 회귀 없음

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 18:16:39 +09:00
a7b4a728d3 11차 F-5: 코드 글자 크기 조절(8~24)
- 한 값을 모든 모니터에(모니터 배율은 플랫폼), 코드 칸만(사용자 결정)
- CodeFontMetrics: 줄 높이 · 번호 칸 · 여백 단추를 같은 비율로, 12 에서 지금 값 그대로
- 화면은 DynamicResource 한 벌, MergeLine.MinimumRowHeight 도 따라감
- Ctrl+휠 · Ctrl++/- · Ctrl+0 · 설정 "보기 > 코드 글자 크기" · 상태 줄 글자 N
- 줄 번호 기준선을 코드와 맞춤
- FontTest 110 · ShortcutTest +14(1,538건)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 16:37:15 +09:00
bc97a2d2e5 11차 F-4 기록: 플랫폼 배포함
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 16:23:30 +09:00
5cef172ed9 11차 F-4: ACTIONS 칸 감추기(단추 · F9) + 아래 탭 줄 접기(플랫폼)
- 위 상태 바 [ACTIONS 감추기 ▶ (F9)], 단축키 표 F9. 칸 · 구분선 폭 0, 펴면 끌어 둔 폭 그대로
- 설정 ActionsHidden 에 기억. 감춘 채 Ctrl+S · Alt+←/→ 그대로
- 덧(사용자 요청): 아래 탭 줄 접기는 플랫폼에 넣음(배포 전)
- 1440p 150%: 코드 칸 폭 +163px · 높이 +71px. ShortcutTest +3

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 16:21:08 +09:00
10740bc948 11차 F-3 뒤 기록: 왼쪽 칸이 기본 저장소로 덮이던 것
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 16:04:15 +09:00
5210ead661 11차 F-3: 탐색기 보내기로 폴더 두 개 바로 비교 · 알림 · 바로가기 저절로 고침
- 잰 것: 탐색기 [보내기] 는 여러 개를 프로세스 하나에 인자로 모두 넘긴다(일곱 경우).
  폴더 둘은 창 하나에서 폴더 비교까지 된다. 설치 파일 필요 없음
- 3개 이상: 앞의 둘 + 알림(StartupArgs.Extra · Notice) - 예전엔 말없이 버림
- 260자 넘는 경로(8.3 이름으로 넘어와 net48 이 못 찾음) 등 없는 경로: 아무것도
  열지 않고 까닭 알림(Missing) - 예전엔 폴더인데 파일 비교로 가서 빈 화면
- 알림은 사용자 이름 창 뒤로 지나가지 않게 본 창이 활성이 된 뒤에
- 켤 때 보내기 바로가기가 옛 자리를 가리키면 지금 실행 파일로(RepairIfMoved,
  등록한 사람만 · 바로가기 파일만 · 레지스트리 안 씀)
- 사용자 결정: 떠 있을 때는 새 창 그대로. ArgsTest +16(1,411건)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 15:57:58 +09:00
9d0cbb7ff8 11차 F-2: 메서드 단위로 골라 반영 · 덩어리 반영의 주석 한 줄
- [이 메서드 반영]: 캐럿이 놓인 클래스 멤버를 통째로(사용자 결정: C# + C/C++,
  메서드 · 생성자 · 속성 · 이벤트 · 연산자 · 필드 · enum, 로컬 함수 안이면 감싸는 멤버)
- MemberRanges: Roslyn 없이 주석 · 문자열(축자 · 보간 · raw · C++ raw · 숫자 구분자)을
  가리고 #if 갈래마다 다시 읽어 중괄호 짝으로 범위. 못 잡으면 단추를 끄고 까닭 한 줄
- 덩어리 · 메서드 반영(ApplyGroup): 머지 주석 한 줄(메서드 이름 위 · 덩어리 첫 줄 위),
  로그 한 줄, Undo · Redo 한 번(LineEdit.Group). 덩어리가 줄마다 주석을 달던 것도 고침.
  주석만 든 편집(NoteOnly)은 직접 수정 · 편집 수에 안 셈
- 메서드 반영 저장본 = 같은 줄 줄 단위 반영 저장본(바이트). MemberTest 83건(23벌 1,395건)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 15:38:04 +09:00
aafd7a5a6f 11차 F-1: 칸 이름 · 칸마다 어느 파일인지 · 머지 주석에 어디서 가져왔는지
- 칸 이름 LOCAL(Mine) · REMOTE(Theirs)(사용자 결정: 표준 용어 + 영문 쪽 이름)
- 칸 머리마다 한 줄 "어느 쪽 · 어느 파일"(PaneHeaders). MERGED · 두 칸 LOCAL 은
  "(저장할 파일)", mergetool · --merge 는 제 임시 파일 이름 - Mine 칸이 MERGED 이름을
  보이던 것(MineHeader) 고침. 좁으면 가운데를 줄이고 툴팁에 전체(MiddleTrim)
- 머지 주석 [사람] 날짜 출처 설명(사용자 결정: 쪽 이름 + 브랜치/해시, 출처 먼저).
  출처는 로그와 같은 말 - 두 칸 로그 BASE(해시) 반영, 브랜치 3-Way 로그 REMOTE(브랜치) 반영
- Take Mine 도 주석(처음 한 번, 되돌리면 함께 빠짐)
- 무시 조건은 [사람] 날짜 뒤를 따지지 않아 코드 그대로 - 옛 · 새 · 출처만 다른 주석을
  하네스로 굳힘(NoteTest · RulesTest · FolderTest · MergeSaveTest, 1,312건)
- 네 길 화면 확인 · E-1 병합 길 회귀 없음

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 14:31:57 +09:00
a99ca970e9 11차 A-4: 변경분을 폴더에 더해 ZIP 으로도
사용자 결정대로 뽑은 폴더 옆에 같은 이름 .zip 을 만든다. 안에 폴더와 안내 파일을 나란히 넣어 풀면 폴더로 뽑은 것과 같은 모양이고, 파일은 바이트 그대로 · 경로는 / · 한글 이름은 UTF-8 표시. .part 에 쓰고 옮겨 반쯤 된 ZIP 을 남기지 않고, 못 만들어도 추출은 성공으로 둔다. UniquePath 는 같은 이름 .zip 이 남아 있어도 그 이름을 쓴 것으로 본다.

하네스 ReportTest +13 (70건, 22벌 1,260건) · 빌드 경고 0 · 오류 0. 아홉 경우를 화면에서 다시 뽑아 ZIP 8/8 을 Windows tar 로 풀어 폴더와 경로 · 해시가 같음, 앱이 만든 ZIP 의 한글 이름 UTF-8 표시 확인. 웹 문서 버전 14. 기획안은 사용자 잠금 대기.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 13:34:39 +09:00
d2709e3d4e 11차 D-1: 시험 도구 둘 — 부모 하나 커밋 검사 · "차이 없음" 읽기
줄끝 검사 스크립트는 부모가 하나면 첫 부모와만 견준다고 적고 git merge-base 를 부르지 않는다. 요약 읽는 함수는 제품의 "차이 없음" 을 읽는다. rebase 한 길을 다시 돌려 오류 줄 0 · 커밋 뒤 요약 "차이 없음". 시험 도구는 저장소 밖이라 기록만. 제품 코드 변경 없음.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 13:22:20 +09:00
8e90f88099 11차 E-2: 웹 문서 · 기획안을 11차에 맞춤
MergeHub 문서 아티팩트 버전 13 — 매뉴얼에 커밋 메시지 고치기 · 변경분 추출 두 절, 한계 셋, 남은 일 · 만든 것 11차, 숫자 1,247건 · 커밋 129. 단추 이름 91개를 소스와 대조해 "맞추지 않음" 을 실제 글자 "C# 스타일 끔" 으로 바로잡음. 기획안 잠금 아티팩트 버전 17 — 커밋 메시지 수정 완료 · 4단계 준비 중(8쪽 A4 높이 그대로, 잠금은 사용자). 제품 코드 변경 없음.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 13:14:18 +09:00
c814c3f1b6 11차 E-1: 바꾼 길을 다시 끝까지 — 새로 걸린 것 없음
A-1 아홉 경우 · C-1 여덟 경우 · C-2 로 이력을 다시 쓴 저장소에서 병합 한 길 · 다섯 길 + pull 을 배포한 플랫폼 위에서 사람 순서로 다시 했다. 누른 수 = 로그, 줄끝 · BOM · 충돌 표식 · class 0, 두 탭 같은 커밋. 시험 도구가 창 최대화를 풀던 것을 고침(제품 아님). 제품 코드 변경 없음.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 12:27:48 +09:00
8bca3206d9 11차 B-2: 플랫폼 배포 · 배포 묶음 다시 만듦 · 시험 흔적 지움
사용자 확인 뒤 publish-platform.ps1 로 D:\UbisamPlatform\bin 갱신(바뀐 것 Core · Shell · README), MergeHub 를 다시 빌드하고 make-bundle.ps1 로 묶음을 새로 만듦(41개 · 43.5MB). 새 묶음으로 켜 네 탭 오류 없음. 시험이 만든 설정 폴더 · 빈 파일 · 시험 묶음은 지움.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 11:29:39 +09:00
85369d951a 11차 B-2: 설정 없는 첫 실행 · D 드라이브가 없는 PC 를 재고 플랫폼에서 고침
첫 실행(D:\UbisamConfig 를 백업하고 이름만 바꿔 잼)은 오류 창 없이 되고
기본값이 매뉴얼 설정 표와 같다. D 드라이브가 없으면 플랫폼이 켜자마자
UiSettingsService.cs:86 에서 실패해, "계속 쓸 수 있습니다" 창 뒤 창 없는
프로세스만 남았다(같은 이름 파일을 두어 같은 줄에서 재현).

플랫폼 377ffd3 에서 고침(사용자 결정): D 를 못 쓰면 %LOCALAPPDATA%\UbisamConfig,
켜는 중 실패는 "켜지 못했습니다" 를 보이고 끝낸다. 플랫폼 배포는 하지 않음.

MergeHub 쪽: 매뉴얼의 설정 저장 자리 문장, MergeHubSettings 주석, 세 문서 기록.
빌드 경고 0 · 오류 0 · 하네스 22벌 1,247건 그대로.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 11:26:04 +09:00
7f2987422b 11차 B-1: 배포 묶음을 다시 만들고 꼭 필요한 파일을 가림
매뉴얼이 가리키던 Release 출력(bin\Release\net48)이 09-07 것이라
폴더 비교 탭 등 6차 이후 기능이 없었다(지금 형식 142개 가운데 74개 없음).

셸 · MergeHub 에서 dll 참조를 따라가 어디서도 닿지 않는 것 7개와
맥 · 리눅스 · ARM 용 네이티브, pdb, 빈 Lang 을 뺀다 - 97MB -> 43.5MB (41개).
플랫폼 Core 가 직접 참조하는 LiveCharts · Skia 는 남긴다(사용자 결정).

- scripts\make-bundle.ps1 (새): Release 빌드 -> 뺄 것 표(까닭 포함)대로 옮기기
  -> 꼭 있어야 할 것 확인 -> 배포묶음.txt(파일 · 크기 · 까닭 · 뺀 것).
  배포묶음.txt 가 없는 폴더에 다른 파일이 있으면 비우지 않고 멈춘다.
- 매뉴얼: 실행 위치 문장 + 배포 묶음 만드는 법

빈 폴더(%TEMP%\mergehub-beta)에서 켜 네 탭 · 병합 한 길(C1Repo) 끝까지:
병합 커밋 647f1f8 부모 둘, 줄끝 · BOM 바뀐 파일 0. 제품 코드 변경 없음.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 11:07:11 +09:00
588f3d75e9 11차 C-2: 이력 줄 우클릭으로 마지막이 아닌 커밋의 메시지를 바꾼다
기획안 1차 범위 "커밋 우클릭 -> 이름 변경". 사용자 결정대로 좁은 범위에서만 한다.

HEAD 가 아닌 커밋의 메시지를 바꾸면 그 커밋부터 HEAD 까지가 새 해시로 다시
써진다. 고른 커밋의 메시지만 갈고 뒤 커밋은 트리 · 작성자 · 작성 시각 ·
부모 관계를 그대로 두어(LibGit2Sharp Refs.RewriteHistory) 해시만 바뀐다.
바꾸기 전 자리는 refs/original/날짜-시각/ 에 남긴다.

막는 자리(메뉴는 켜 두고 눌렀을 때 까닭과 푸는 길을 알림으로):
작업 중 · 커밋 안 한 변경 · 지금 브랜치 조상 아님 · 원격에 올라감 ·
다른 로컬 브랜치도 품음 · 구간에 태그 · 사이에 병합 커밋.
파일 비교 탭의 저장 안 한 편집은 우클릭해 줄을 고를 때 기존 창으로 묻는다.

- CommitReword (새): 막을 까닭 · 확인 글 · 완료 알림 · 새 메시지 다듬기
- GitService.InspectReword / RewordCommit, RewordInfo
- RewordWindow (새): 여러 줄 입력, [바꾸기] 는 기본 단추가 아님
- GitView: MergeHub 첫 우클릭 메뉴, 우클릭한 줄을 먼저 고른다
- 선택이 고친 커밋의 새 해시를 따라간다
- 화면에서 찾아 고침: 새 메시지가 끝 줄바꿈 없이 저장됐다 -> git -m 처럼
  다듬는다(뒤 커밋까지 다듬지 않게 새 메시지 하나만)

하네스 MergeSaveTest +40 (272건, 22벌 1,247건) · 빌드 경고 0 · 오류 0.
화면 확인: 되는 자리 1(트리 · 작성자 · 작성 시각 같음, 되돌리기 확인) ·
막는 자리 8 모두 막힘.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 10:34:58 +09:00
8f9ac13872 11차 C-1(마무리): [커밋 수정] 은 위험한 자리에서 먼저 묻는다
스테이징해 둔 파일이 있으면 그 파일도 이 커밋에 들어간다는 것을, 이미 원격에
올라간 커밋이면 고치는 순간 다음 Push 가 거부된다는 것을 누르기 전에 알린다.
둘 다 걸리면 한 창에 두 줄로 묻고, [아니오] 면 커밋도 메시지 칸도 그대로 둔다.

막지 않고 묻기만 하는 까닭 - 앞선 커밋 수는 마지막 fetch 시점 기준이라
남이 이미 받아 갔는지는 확실히 알 수 없고, 빠뜨린 파일을 같이 넣으려고
일부러 그러는 사람도 있다.

- CommitSelection.AmendWarning: 물을 것이 없으면 null(안 묻는다)
- GitViewModel: 스테이징 수 · 추적 브랜치 · 앞선 커밋 0개인지로 판단
- 하네스 MergeSaveTest +7 (232건, 22벌 1,207건) · 빌드 경고 0 · 오류 0
- 화면 확인(e11-c1g.ps1): 두 줄 다 물음 -> [아니오] 뒤 HEAD · 스테이징 ·
  메시지 칸 그대로 -> [예] 뒤 "옛 62dd57f -> 새 6207b26 · 파일 1개 포함",
  물을 것이 없는 자리에서는 안 묻고 바로 고침

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 17:13:52 +09:00
aa3f179390 11차 C-1(일부): [커밋 수정] 을 다시 내 보고 넷을 바로잡음
화면에서 여덟 가지를 먼저 재현하고, 방향이 정해진 1 · 3 · 4 · 7 만 고쳤다.

- [마지막 메시지] 는 이력 맨 위가 아니라 HEAD 커밋 메시지를 읽는다 (CommitSelection.MessageOfHead)
- 고쳐 써도 원래 작성자 · 작성 시각을 지킨다 (git 과 같게, 커밋한 사람만 지금)
- 병합 · rebase · cherry-pick · revert 중에는 단추를 끈다 (CanAmend) · 꺼진 까닭을 단추 설명으로
- 알림에 '커밋 수정 완료 (옛 bcd2c43 → 새 fd7810c) · 파일 1개 포함'
- GitWorkspace 가 HeadFullSha 를 들고 있는다
- 하네스 MergeSaveTest +15 (210 → 225), 22벌 1,200건 통과, 빌드 경고 0 오류 0

남은 결정: 2(스테이징 파일이 함께 들어가는 것) · 6(이미 올린 커밋). 8(여러 줄 메시지)은 범위 밖으로 적어 둠.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 16:58:59 +09:00
bd270f4628 11차 F-1 에 덧: 머지 주석에 출처(REMOTE/BASE)와 무시 조건 손보기
사용자 추가 설명(2026-09-18): 리모트 · 베이스 중 어디서 가져왔는지 이력 주석에도 남기고, 그에 맞춰 무시 조건을 고친다.

- 지금은 주석이 [사람] 날짜 뿐이고 출처는 화면 로그에만 남는다(앱을 끄면 사라짐)
- 방향: 주석 몸통에 출처 한 토막(REMOTE 브랜치 · MINE · BASE 해시), 쓰는 말은 로그 · 화면과 같게
- 무시 조건 고칠 곳: MergeNote(NoteBody · LooksLikeNote · TailStart) · CompareRules · FolderComparer · NoteConflict · NoteRows
- 기준: 옛 주석(출처 없음)도 그대로 무시 · 출처만 다른 주석은 같음(머지 주석만 다름) 과 자동 해결 유지 · 10차 C-1 회귀 없음
- 정할 것: 출처를 어디까지 적을지(쪽 이름만 / 브랜치 · 해시까지)

제품 코드 변경 없음.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 15:41:51 +09:00
77ed65de6b 11차 A-3: 고른 폴더 아래 새 폴더로 뽑고, 막히면 먼저 알린다
사용자 결정(2026-09-18): 새 폴더를 만든다 · 쓰다 막히면 먼저 보고 시작한다.

- Services/ExportPlan.cs (새 파일): 폴더 이름(변경분_범위_날짜) · 같은 이름이면 _2 _3 · 쓸 수 있는지 먼저 보기 · 보일 글
- GitService.ExportChangedFiles: 쓰기 전에 막힌 파일을 먼저 보고, 하나라도 있으면 폴더도 만들지 않고 멈춘다
- GitViewModel: 고른 폴더 아래 새 폴더에 뽑고 안내는 그 옆에. 알림에 폴더 이름
- 하네스 ReportTest +12 (45 → 57), 22벌 1,185건 통과, 빌드 경고 0 오류 0
- 화면 확인: 같은 폴더에 두 번 뽑아 _2 가 생기고 기존 파일(메모 · 옛 폴더)은 그대로

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 15:39:16 +09:00
500afdd992 11차 A-2: 뽑은 폴더 옆에 변경분 안내 파일
사용자 결정(2026-09-18): 안내는 폴더 밖(옆)에 · 지울 파일은 목록으로만.

- Services/ExportReport.cs (새 파일): 머리글(만든 때 · 사람 · 저장소 · 뽑은 곳 · 범위 두 줄) · 뽑은 파일 목록(추가 · 수정 · 이름 바뀜은 옛 이름 병기) · 장비에서 지워야 할 파일 목록. PathFor 가 폴더 옆 이름을 정함
- GitService.ExportChangedFiles 가 무엇을 어떻게 했는지 목록까지 돌려줌 (IGitService 같이)
- GitViewModel: 뽑은 뒤 안내를 폴더 옆에 쓰고 경로를 로그에. 안내를 못 써도 추출은 성공으로 둔다
- 하네스 ReportTest +14 (31 → 45), 22벌 1,173건 통과, 빌드 경고 0 오류 0
- 화면 확인: 범위 4eb9ece→cbcad8a 안내가 git diff -M 과 같음(뽑은 3 · 지울 2), 병합 커밋은 '(고른 커밋의 부모)' 표시

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 15:30:27 +09:00
df9202c6d5 11차 F-12: C# 코드 스타일 맞춤 기본값을 AURORA 로
사용자 결정(2026-09-18): 제품 기본값 AURORA · C# 파일만 · 저장 동작은 지금 그대로.

- MergeHubSettings.CSharpBraceStyle 기본값 None → Aurora (한 줄, 까닭 주석)
- C/C++ · XAML 은 고칠 것 없음 - CSharpStyle.Applies 가 확장자 .cs 만 본다
- 하네스 StyleTest +12 (78 → 90): 기본값 · 확장자별 적용 여부. 먼저 넣어 기본값 검사만 실패하는 것을 보고 시작
- 설정 파일 없는 첫 실행: 상태바 'C# AURORA' · C# 짝 차이 없음 · C++ 짝 남은 차이 4줄 · 새로 만든 설정에 1
- 웹 문서 매뉴얼 · 설정 표 · 시연 대본의 '기본은 끔' 을 고침
- 22벌 1,159건 통과 · 빌드 경고 0 오류 0

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 14:02:35 +09:00
f597dd48fd 11차 A-1: 변경분 추출을 아홉 경우로 뽑아 보고 적음 (고치지 않음)
시험 저장소에 추출용 커밋을 쌓고(새 파일 · 수정 · 삭제 · 이름 바꿈 · 이진 · 한글 깊은 경로 · 되돌림 · 옆가지 병합) 화면에서 사람 순서로 뽑아 git 과 바이트까지 대조.

맞은 것: 파일 고르기(커밋 하나 · 범위 · 병합 첫 부모 · 거꾸로 범위 모두 git 과 같은 목록) · 바이트 보존 · 범위 표시 · 로그
확정된 문제 넷:
- 지운 파일 · 이름 바뀐 옛 경로가 결과에 안 남음 (A-2)
- 무엇과 무엇 사이를 뽑았는지 폴더에 안 남음 (A-2)
- 비어 있지 않은 폴더에 묻지 않고 덮어써 옛 추출이 섞임 (A-3)
- 쓰다 막히면 반쯤 뽑힌 채 멈추고 어디까지 됐는지 모름 (A-3 에 덧)

제품 코드 변경 없음. 시험 도구 세 곳을 고침(별칭 겹침 · 폴더 창 자리 · 창 안 칸 찾기).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 13:48:53 +09:00
9b5fdc6343 11차 지시서에 F 절(2026-09-18 추가 요청 열한 가지)
사용자가 한꺼번에 준 요청을 코드에 비춰 보고 F-1 ~ F-11 로 적었다(코드 변경 없음).
- F-1 칸 이름 맞추고 칸마다 어느 파일인지 · F-2 메서드 단위 반영 · F-3 폴더 두 개 보내기(설치 없이 되는지 포함)
- F-4 툴박스 감추기 · F-5 글자 크기 · F-6 넓게 보기 · F-7 모니터
- F-8 저장 뒤 되돌리기 · F-9 백업본 저장 · F-10 덩어리 잇기 UI · F-11 Git 계정 · 토큰 저장 확인
- 항목마다 지금 코드 상태(파일 · 줄)와 정할 것 · 판정 기준을 적음

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 13:39:57 +09:00
d35c6b1ad0 11차 지시서 만들기 · 10차 마무리
10차 전부 끝(E-1 새로 걸린 것 없음). 기획안 v1.2 에서 일부로 남은 것과 베타 전 확인에서 나온 것을 11차로(코드 변경 없음).
- A 변경분 추출: 먼저 뽑아 보고 적기 · 무엇을 뽑았는지 남기기 · 비어 있지 않은 폴더 · ZIP
- B 배포 폴더가 09-07 것 · D 드라이브 고정 설정 위치와 첫 실행
- C-1 있는 [커밋 수정]: [마지막 메시지] 가 목록 맨 위 · 스테이징 파일이 말없이 들어감 · 작성자 · 시각이 바뀜 · 작업 중에도 켜짐 · 병합 커밋 · 올린 커밋 · 옛 해시
- C-2 마지막이 아닌 커밋 메시지 수정은 할지 정함
- D 시험 도구 · E 확인 · 문서

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 17:01:18 +09:00
20d42c4aee 10차 E-2: 웹 문서를 10차 끝 기준으로 (아티팩트 버전 11)
- 발행본(버전 10)이 9차 D-1 파일과 같음을 먼저 확인
- 매뉴얼: 두 탭은 같은 커밋을 본다 · 알아 둘 한계에서 고친 둘(B-1 · C-1) 뺌
- 남은 일: 10차에서 고친 것 · 10차에 남은 것(HDD)
- 지금까지 만든 것 · 기획안 v2 일정 · WinMerge 숫자: 1,147건 · 커밋 114
- 10차 D-1 · F-3 에서 로컬로만 고친 문장도 함께 발행
- 화면 문구 grep 대조 · 태그 짝 맞음

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:44:46 +09:00
a0c7621633 10차 E-1: 다섯 길(+ pull)을 다시 끝까지 - 새로 걸린 것 없음
병합 · pull · rebase · cherry-pick · revert 를 새 저장소에서 MergeHub 만으로 끝까지.
파일 비교 탭 미리 안 엶, cherry-pick · revert 는 [모든 브랜치] · Git 탭 이력을 마우스로.

- 누른 Take = 줄 고른 로그: 18 · 18 · 18 · 18 · 6
- 마지막 Save 뒤 제목 · 요약 · 기준 = git diff, 커밋 뒤 새 HEAD
- 줄끝 · BOM 바뀐 파일 0 (33 · 33 · 31 · 33 · 36) · 충돌 표식 0 · class 이름 0
- Git 탭에서 고른 커밋을 파일 비교 탭이 바로 따라옴 (10차 B-1)
- 8차 A-1 · B-1 · B-2 · F-1 · 9차 A-1 · A-2 · B-1 안 남
- 제품 코드 변경 없음

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:36:36 +09:00
fadc000081 10차 F-3: 폴더 비교 "주석만 다름" 을 "다름(코드는 같음)" 으로
주석 · 공백을 걷어내고 견주는 판정이라 BOM · 줄끝 · 인코딩 · 끝 공백 · 빈 줄 · 들여쓰기만
다른 파일도 "주석만 다름" 이었다. 사용자: "이름을 바꿔줘". 판정 · 수는 그대로.

- 목록 · 범례(설명 붙임) · 요약 "다름 N(코드는 같음 M)" · 비교 결과 보고서
- 웹 문서의 이름도 바꿈(지난 기록은 그대로, 발행은 E-2)
- 하네스 FolderTest +1 (78건), 22벌 1,147건 통과, 빌드 경고 0 오류 0

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:05:13 +09:00
ccc657803b 10차 F-1 · F-2: 폴더 비교 "같은 것만" 에 다른 것처럼 보이던 줄
사용자가 시험 묶음 측정 화면에서 "같은 것만" 에 내용이 다른 파일이 보인다고 알림.
비교 판정은 설계대로(코드 값이 다르면 어느 설정에서도 다름)였고, 화면에서
- F-1: 같은 파일을 품은 폴더 줄이 폴더 자신의 상태 "다름"(주황)으로 보였다
- F-2: 설정(C# 스타일 맞춤 · 머지 주석 무시)으로 같음이 된 파일이 크기가 달라도 그냥 "같음"

- FolderComparer: SameReason 을 남기고 FolderStatusText 로 글자를 정함
- FolderViewModel: 같은 것만 · 왼쪽에만 · 오른쪽에만이면 폴더 줄을 "같음 122개" 처럼 걸린 수와 그 갈래 색으로
- FolderView: 줄 색이 DisplayStatus, 상태 칸 90 → 200
- 사용자 결정: 같음으로 두고 "같음(스타일만 다름)" · "같음(머지 주석만 다름)" 으로 표시
- 하네스 FolderTest +15 (77건), 22벌 1,146건 통과, 빌드 경고 0 오류 0

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-17 16:00:56 +09:00