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>
This commit is contained in:
김승준 2026-09-18 13:39:57 +09:00
parent d35c6b1ad0
commit 9b5fdc6343
3 changed files with 107 additions and 3 deletions

View File

@ -8,6 +8,7 @@
| 날짜 | 항목 | 커밋 |
|---|---|---|
| 2026-09-18 | **11차 F 절 (추가 요청)** — 사용자가 한꺼번에 준 열한 가지를 지시서에 넣음: 칸 이름 · 어느 파일인지(F-1) · 메서드 단위 반영(F-2) · 폴더 두 개 보내기 + 설치 없이 되는지(F-3) · 툴박스 감추기(F-4) · 글자 크기(F-5) · 넓게 보기(F-6) · 모니터(F-7) · 저장 뒤 되돌리기(F-8) · 백업 저장(F-9) · 덩어리 잇기 UI(F-10) · Git 계정 · 토큰 저장 확인(F-11). 항목마다 지금 코드가 어떤지와 정할 것을 함께 적음. 코드 변경 없음 | 아래 |
| 2026-09-17 | **11차 지시서** — 10차 전부 끝(E-1 새로 걸린 것 없음). 기획안 v1.2 에서 "일부" 로 남은 것과 베타 전 확인에서 나온 것을 11차로 — A 변경분 추출(먼저 뽑아 보고 적기 · 지운 파일 · 범위 안내 · 비어 있지 않은 폴더 · ZIP) · B 배포 폴더가 09-07 것 · D 드라이브 고정 설정 위치 · C 커밋 메시지 수정(있는 [커밋 수정] 의 [마지막 메시지] 가 목록 맨 위 · 스테이징 파일이 말없이 들어감 · 작성자가 바뀜 · 작업 중에도 켜짐, 임의 커밋 수정은 할지 정함) · D 시험 도구 · E 확인 · 문서. 코드 변경 없음 | 아래 |
| 2026-09-17 | **10차 E-2** — 웹 문서를 10차 끝 기준으로(아티팩트 버전 11). 발행본이 9차 D-1 파일과 같음을 먼저 확인. 매뉴얼에 두 탭이 같은 커밋을 본다는 설명, 알아 둘 한계에서 고친 둘(Git 탭 고른 커밋 안 따라옴 · 규칙 끈 채 반영 색) 뺌, 남은 일 · 지금까지 만든 것에 10차, 숫자(1,147건 · 커밋 114). 10차 D-1 · F-3 에서 로컬로만 고친 문장도 함께 발행 | 아래 |
| 2026-09-17 | **10차 E-1** — 새로 만든 저장소에서 병합 · pull · rebase · cherry-pick · revert 를 MergeHub 만으로 끝까지(파일 비교 탭 미리 안 엶, cherry-pick · revert 는 [모든 브랜치] · Git 탭 이력을 마우스로). 다섯 길 모두 첫 회차에 끝, 누른 Take = 줄 고른 로그(18 · 18 · 18 · 18 · 6), 마지막 Save 뒤 제목 · 요약 · 기준이 git 과 같음, 줄끝 · BOM · 충돌 표식 · class 이름 0. Git 탭에서 고른 커밋을 파일 비교 탭이 바로 따라옴. 8차 · 9차 회귀 없음, 새로 걸린 것 없음. 제품 코드 변경 없음 | 아래 |

View File

@ -19,7 +19,7 @@
## 공통 규칙
- **A → B → C → D → E 순서로 진행한다.** A 는 사용자가 물어 본 것이라 먼저다. B 는 베타 날짜가 있어 C 보다 앞이다.
- **A → B → C → D → E → F 순서로 진행한다.** A 는 사용자가 물어 본 것이라 먼저다. B 는 베타 날짜가 있어 C 보다 앞이다. F(2026-09-18 추가 요청)는 앞의 것을 끝낸 뒤 하나씩 올린다 — 급한 것이 있으면 사용자가 순서를 바꿔 말한다.
- **항목 하나를 끝낼 때마다** 빌드하고 실제로 실행해 화면을 확인한 뒤 보고한다.
- **항목 하나가 끝나면 기록을 세 군데에 남기고 로컬 커밋한다**(4차 D-2 규칙).
1. **상세**는 `doc/history/YYYY-MM-DD-11차.md` — 원인 · 판단 · 확인한 결과
@ -171,19 +171,106 @@
### E-1. 바꾼 길을 다시 끝까지
- A 를 고쳤으면 A-1 의 9가지를 다시 돌려 표를 채운다. C-1 을 고쳤으면 C-1 의 여덟 가지를 다시, C-2 를 했으면 메시지를 바꿔 이력을 다시 쓴 저장소로 병합 한 길을 끝까지.
- F 에서 화면 · 저장을 건드렸으면 그 길도 함께 본다. A 를 고쳤으면 A-1 의 9가지를 다시 돌려 표를 채운다. C-1 을 고쳤으면 C-1 의 여덟 가지를 다시, C-2 를 했으면 메시지를 바꿔 이력을 다시 쓴 저장소로 병합 한 길을 끝까지.
- 제품의 병합 · 저장 코드를 건드렸다면 10차 E-1 처럼 **다섯 길(+ pull)** 을 다시 한다. 안 건드렸다면 병합 한 길만(회귀).
- **판정 기준**: 줄끝 · BOM 바뀐 파일 0 · 충돌 표식 0 · class 이름 다른 Unit 파일 0 · 누른 수 = 줄 고른 로그. 10차 B-1(두 탭 같은 커밋)이 다시 나지 않는다.
### E-2. 웹 문서 · 기획안을 11차에 맞게
- **MergeHub 문서**(`doc/web/index.html`, 아티팩트 "MergeHub 문서"): 매뉴얼 변경분 추출 · 실행 위치(B-1) · 설정 위치(B-2) · 알아 둘 한계 · 남은 일 · 지금까지 만든 것. 발행본을 먼저 읽고 합쳐 올린다.
- **MergeHub 문서**(`doc/web/index.html`, 아티팩트 "MergeHub 문서"): 매뉴얼 변경분 추출 · 실행 위치(B-1) · 설정 위치(B-2) · F 에서 바뀐 화면(칸 이름 · 감추기 · 글자 크기 · 백업 저장 · 보내기) · 알아 둘 한계 · 남은 일 · 지금까지 만든 것. 발행본을 먼저 읽고 합쳐 올린다.
- **기획안 v1.2**(잠금 아티팩트 "UbiSam MergeTool 개발 기획안"): 3.2 기능 목록의 변경분 추출 · 커밋 메시지 수정 상태, 4단계 진행. 원문은 로컬에서 고치고 A4 쪽마다 원본과 같은 높이인지 그림으로 견준다.
**잠금은 사용자가 비밀번호로 한다** — 잠그지 않은 파일은 올리지 않는다(공유 링크가 열린 사내 문서).
- **판정 기준**: 문서의 단추 이름 · 흐름이 지금 화면과 같다(grep 대조). 태그 짝 맞음. 기획안 새 잠금 파일을 풀면 고친 원문과 바이트가 같다.
---
## F. 추가 요청 (2026-09-18, 사용자)
열한 가지를 한꺼번에 받았다. **다 하는 것이 아니라 하나씩 올린다** — F-1 · F-2 · F-3 은 화면과 저장에 바로 닿고, F-4 ~ F-7 은 보이는 양을 늘리는 한 묶음, F-8 ~ F-11 은 저장 · 확인이다.
아래 "지금은" 은 코드를 읽고 적은 것이다(2026-09-18). 항목마다 **화면에서 먼저 다시 보이고** 시작한다.
### F-1. LOCAL · REMOTE · MERGED 이름을 맞추고, 그 칸이 **어느 파일인지** 보이게
- 지금은: 칸 이름이 `BaseTitle => "BASE"` · `LocalTitle => IsThreeWay ? "MERGED" : "LOCAL"`(`HomeViewModel.cs:2393`)뿐이고, "한글 풀이를 붙이지 않는다" 는 판단이 바로 위 주석(`:2389`)에 적혀 있다.
파일 경로는 **맨 위 한 줄에 한 번만** 나온다(4차 C-1 에서 세 곳 → 한 곳으로 줄였다). BASE 칸에만 `(merge base) 경로`, REMOTE 칸에는 브랜치 · 커밋이 붙는다.
- 그래서 `git mergetool` 로 열었을 때처럼 **네 칸이 서로 다른 파일**(임시 `--base` · `--local` · `--remote` · `--merged`)을 볼 때 어느 칸이 어느 파일인지 화면에 없다.
- 방향: 칸 머리마다 한 줄로 **무엇 · 어느 파일 · 어느 커밋/브랜치**. 예) `MERGED · Weld/Unit1.cs (저장할 파일)` · `REMOTE(Theirs) · feature/theirs · Weld/Unit1.cs`.
긴 경로는 가운데를 줄이고 전체는 마우스를 올리면 보이게. 로그 · 보고서 · 매뉴얼에서 쓰는 말도 같은 말로 맞춘다.
- **정할 것**: 이름을 표준 용어 그대로 둘지(`LOCAL(Mine)`), 한글 풀이를 함께 붙일지(`LOCAL(내 쪽)`). 4차 · 6차에 "표준 용어 그대로" 로 정한 적이 있어 뒤집는 결정이다.
- **판정 기준**: 두 칸 · 네 칸 · `git mergetool` · `--merge` 네 길에서 칸마다 파일 이름이 보이고, 그 파일이 실제로 읽은 · 저장할 파일과 같다(8차 A-1 의 "화면에 실린 파일" 과 같은 값). 좁은 폭에서도 줄이 늘어나지 않는다.
### F-2. **메서드 단위**로 골라 반영 (지금은 줄 · 덩어리 · 전체)
- 지금은: 반영 단위가 줄(`[>]`) · 이어진 차이 덩어리(`이 덩어리 반영`) · 전체뿐이다. 덩어리를 반영하면 머지 주석은 덩어리 첫 줄 위에 한 줄 붙는다.
- 요청: **메서드를 통째로** 고르고, 머지 주석은 **메서드 이름 위에 한 줄만**.
- 방향: Roslyn 없이 `CodeTokenizer` 로 중괄호 짝과 시작 줄을 찾아 메서드 범위를 잡는다. 문자열 · 주석 · 전처리기(`#if`) 안의 중괄호에 속지 않아야 한다.
캐럿이 놓인 메서드를 잡아 [이 메서드 반영]. 범위를 잡지 못하면 단추를 끄고 까닭을 알린다(틀린 범위를 반영하는 것보다 낫다).
- **정할 것**: C# 만 먼저 할지(XAML · C/C++ 은 뒤로), 속성 · 로컬 함수 · 생성자도 "메서드" 로 볼지.
- **판정 기준**: 시험 파일에서 메서드 20개(한 줄 메서드 · 중첩 중괄호 · 문자열 안 중괄호 · `#if` 로 갈린 메서드 · 주석 안 중괄호 포함)의 범위를 정확히 잡는다(하네스). 반영한 뒤 저장 결과가 줄 단위로 같은 범위를 반영한 것과 **바이트가 같다**. 머지 주석은 메서드 이름 위 한 줄.
### F-3. 탐색기에서 **폴더 두 개**를 골라 [보내기] 로 바로 비교
- 지금은: 보내기 등록은 `%APPDATA%\Microsoft\Windows\SendTo` 에 바로가기 하나를 두는 것이 전부다(`ShellIntegration.cs:18`, 관리자 권한 · 레지스트리 없음).
명령줄 쪽은 폴더 두 개를 받으면 폴더 비교로 연다(`StartupArgs.cs:118~122`). 그런데 탐색기가 **여러 개를 고른 보내기**를 어떻게 넘기는지(한 번에 인자 둘 / 프로세스를 두 번)는 재 보지 않았다.
- 확인할 것: 파일 2개 · **폴더 2개** · 폴더 1개 · 3개 이상 · 경로에 공백 · 한글 · 아주 긴 경로. 프로세스가 두 번 뜨면 **하나로 모으는 길**(이미 떠 있는 창으로 보내기)을 정한다.
- **설치 파일 없이 되는지**도 여기서 답한다 — 지금 구조(바로가기 하나 · HKCU/HKLM 안 씀)면 설치 관리자가 필요 없다. 다만 배포 묶음을 옮기면 바로가기 경로가 어긋나므로 [탐색기 보내기 등록] 을 다시 눌러야 하는지, 켤 때 저절로 고칠지 정한다(B-1 배포 묶음과 함께).
- **판정 기준**: 폴더 두 개를 골라 보내기 → 창 하나에 왼쪽 · 오른쪽 폴더가 들어가 비교까지 간다. 위 일곱 경우의 결과를 값으로 적는다. 레지스트리를 쓰지 않는다.
### F-4. 파일 비교 탭의 **툴박스(ACTIONS)를 감추는 단추**
- 지금은: ACTIONS 칸은 접어도 **폭이 그대로**다(4차 C-5 결정, `HomeView.xaml:864`). 접기는 "한 번 정하는 것"(저장 형식 · 비교 규칙)에만 걸려 있다.
- 방향: 칸 전체를 감춰 코드 폭을 넓히는 단추(또는 `F9` 같은 키). 감춘 상태를 설정에 기억. 감춘 채로도 저장 · 반영 키는 살아 있어야 한다.
- **판정 기준**: 감추면 코드 칸 폭이 그만큼 늘고, 다시 펴면 원래대로. 앱을 껐다 켜도 상태가 남는다. 감춘 상태에서 `Ctrl+S` · `Alt+←/→` 가 그대로 듣는다.
### F-5. **글자 크기 조절**
- 지금은: 코드 칸은 `Consolas 12` 로 XAML 에 박혀 있고(`HomeView.xaml:163` 등), 설정에 글자 크기 항목이 없다.
- 방향: 설정 값 하나 + `Ctrl` + 휠 · `Ctrl` + `+`/`-` 로. 코드 칸 · 줄 번호 · 미니맵이 같이 커지고 줄 높이도 따라야 한다.
- **판정 기준**: 8pt ~ 24pt 에서 줄 번호 · 여백 단추 · 미니맵 자리가 어긋나지 않는다. 바꾼 크기가 앱을 껐다 켜도 남는다. 네 칸에서 세 칸의 줄 높이가 서로 맞는다.
### F-6. **글자를 되도록 많이 보이게**
- 지금은: 6차에서 셸 상 · 하단 띠를 줄여 코드가 3줄 더 보이게 했다. 그 뒤로는 더 재지 않았다.
- 방향: 한 단추(또는 키)로 **넓게 보기** — 색 구분 범례 줄 접기 · ACTIONS 감추기(F-4) · 위 줄 한 줄로 · 줄 간격 좁히기.
- **판정 기준**: 1920 × 1080 에서 지금 몇 줄이 보이는지 재고, 넓게 보기로 **몇 줄이 늘었는지** 값으로 적는다(예: 34줄 → 44줄). 글자 크기(F-5)와 섞어 써도 깨지지 않는다.
### F-7. **어느 모니터에서든** 제대로 뜨게
- 지금은: 창 자리 기억은 플랫폼이 한다(`ShellWindow.xaml.cs:475` `PreparePlacement` · 모니터 작업 영역과 배율로 최소 크기를 다시 계산). 8차 C-3 에서 첫 `Win`+`↓` 와 확인 창 가운데 맞춤을 고쳤다.
- **먼저 증상부터 적는다** — 어느 모니터에서 무엇이 잘못되는지(창이 화면 밖 · 너무 작음 · 글자만 크게 · 두 번째 모니터에서 안 뜸 · 배율 150% 에서 잘림). 재현되지 않으면 고치지 않는다.
- 플랫폼을 고치면 다른 소비 프로그램에 영향이 있다 — 영향과 함께 **사용자 확인 뒤** 배포.
- **판정 기준**: 증상과 조건(모니터 수 · 해상도 · 배율 · 주 모니터 위치)을 적는다. 고쳤다면 같은 조건에서 창이 보이는 자리에 뜨고, 기억한 자리가 사라진 모니터면 주 모니터로 온다.
### F-8. **저장한 뒤에도 되돌리기**가 되게
- 지금은: 저장하는 네 길이 모두 되돌리기 스택을 비운다 — `SaveResolvedAsync:977` · `SaveAndCommitAsync:896` · `SavePlainAsync:2686` · `SaveWorkingCopy:2836`. 저장한 글이 새 기준(`_originalLocalText`)이 되기 때문이다.
- 방향: 스택을 비우는 대신 **저장 지점을 표시**한다. 그 아래로 되돌리면 다시 "저장할 것 있음" 이 되고, 다시 저장 지점으로 오면 없어진다.
- **정할 것**: 병합 중 [Save] 까지 되돌릴지. 이 저장은 git 인덱스에 "해결" 로 등록하므로, 되돌리면 인덱스를 어떻게 할지 함께 정해야 한다(되돌리면 다시 충돌로 / 화면만 되돌리고 인덱스는 그대로 · 알림).
- **판정 기준**: 저장 → Undo → 화면이 저장 전으로, 상태가 "저장할 것 있음". Redo 로 다시 저장 후로. [전체 되돌리기] 의 기준이 정한 대로 움직인다. 하네스로 "저장 표시가 있는 스택" 을 먼저 만든다.
### F-9. **백업본으로 저장** — 원본을 건드릴지 고르게
- 지금은: 저장은 늘 원본 파일을 덮어쓴다. `.bak` 도, 다른 이름으로 저장도 없다.
- 방향: [저장] 옆에 **[다른 이름으로 저장]**, 또는 설정 "저장할 때 원본을 `파일명.bak` 으로 남기기". 남긴 백업의 이름 규칙(날짜 · 번호)과 지우는 시점을 정한다.
- **정할 것**: 병합 중 · Git 저장소에서도 같게 할지. 병합 중 [Save] 는 git 인덱스에 등록하는 일이라 "원본을 건드리지 않음" 과 어울리지 않는다 — Git 아닐 때만 둘지 정한다.
- **판정 기준**: 켠 채로 저장하면 원본과 백업이 둘 다 남고, 백업은 **저장 전 바이트 그대로**(해시 대조). 끄면 지금과 같다. 폴더 비교 · 변경분 추출이 백업 파일을 결과에 섞지 않는다.
### F-10. 덩어리(블록)가 **어디로 갔는지 UI 로 잇기**
- 지금은: 자리만 옮긴 덩어리를 찾아 "자리 옮김" 색으로 칠한다(`MoveDetector`). 하지만 **어디에서 어디로** 갔는지는 색만으로 알기 어렵다. 줄 위치가 많이 벌어지거나 순서가 바뀌면 두 칸을 눈으로 따라가야 한다.
- 방향: 두 칸 사이에 **잇는 선**(또는 같은 번호표)을 그려 짝을 보이게. 미니맵에도 같은 표시. 고른 덩어리의 짝으로 한 번에 건너뛰는 단추.
- **판정 기준**: 메서드 세 개의 순서를 바꾼 시험 파일에서 세 짝이 모두 선으로 이어지고, 잇는 선이 잘못 짝지은 것 0. 스크롤 · 접기 · 글자 크기(F-5)를 바꿔도 선이 제자리. 차이 수 · 저장 내용은 그대로.
### F-11. Git 계정 · URL · 암호가 **한 번 쓰면 저장되는지** 확인
- 지금은: 서버 주소와 계정은 설정 파일에 저장된다(`MergeHubSettings.cs:40` `GiteaUrl` · `:44` `GiteaUserName`). **암호 · 토큰은 저장되지 않는다** — 화면의 PasswordBox 에서 받아 메모리(`GitWorkspace.Password:154`)에만 두고, Fetch · Pull · Push 직전에 붙인다(`ApplyCredentials:519`).
그래서 앱을 껐다 켜면 토큰을 다시 넣어야 한다.
- 먼저 화면으로 확인해 적는다: 껐다 켠 뒤 주소 · 계정이 남는지, 암호 칸이 비는지, 그 상태로 Fetch 를 누르면 무엇이라 하는지.
- **정할 것**: 토큰을 저장할지. 저장한다면 **평문은 안 된다** — 윈도 자격 증명 관리자(DPAPI) 에 사용자 계정으로 묶어 넣는다. 저장하지 않기로 하면 매뉴얼에 그렇게 적는다.
- **판정 기준**: 확인한 결과를 적는다. 저장하기로 하면 설정 파일 어디에도 토큰 글자가 없고(파일 grep 0), 껐다 켜도 Push 가 다시 묻지 않는다. 지우는 단추가 있다.
---
## 이번 지시서에서 하지 않는 것
- **실제 소스로 해 보기** — 실제 소스는 열지 않는다(2026-09-11 결정).

View File

@ -366,6 +366,22 @@
| 대기 | E-1 바꾼 길을 다시 끝까지 (병합 · 저장 코드를 건드렸으면 다섯 길 + pull) |
| 대기 | E-2 웹 문서 · 기획안(잠금, 사용자가 비밀번호로 잠금)을 11차에 맞게 |
### F. 추가 요청 (2026-09-18 사용자)
| 상태 | 항목 |
|---|---|
| 대기 | F-1 LOCAL · REMOTE · MERGED 이름 맞추고 칸마다 어느 파일인지 보이게 (지금은 경로가 맨 위 한 줄에만) |
| 대기 | F-2 메서드 단위로 골라 반영 · 머지 주석은 메서드 이름 위 한 줄 (지금은 줄 · 덩어리 · 전체) |
| 대기 | F-3 탐색기에서 폴더 두 개를 [보내기] 로 바로 비교 + 설치 파일 없이 되는지 확인 |
| 대기 | F-4 파일 비교 탭 툴박스(ACTIONS) 감추는 단추 (지금은 접어도 폭 그대로) |
| 대기 | F-5 글자 크기 조절 (지금은 Consolas 12 고정) |
| 대기 | F-6 글자를 되도록 많이 보이게 — 넓게 보기 한 단추, 늘어난 줄 수로 잼 |
| 대기 | F-7 어느 모니터에서든 제대로 뜨게 — 증상부터 적고 플랫폼 영향 확인 |
| 대기 | F-8 저장한 뒤에도 되돌리기 (지금은 저장 네 길이 스택을 비움) |
| 대기 | F-9 백업본으로 저장 · 원본을 건드릴지 고르게 |
| 대기 | F-10 덩어리가 어디로 갔는지 UI 로 잇기 (지금은 "자리 옮김" 색만) |
| 대기 | F-11 Git 계정 · URL · 암호 저장 확인 (지금은 주소 · 계정만 저장, 토큰은 메모리) |
---
## 3~4주차로 미룬 것