크라우니 오피스 브릿지 2차 — 실행취소/재실행 스택 (punch #3)
개요
spec/문서기능-판정표.md punch #3(실행취소↺·재실행↻ — 툴바 정적 div, onClick 없음)을
crownyBridge.js(즉시층)에 자체 스냅샷 스택으로 배선. 앱 번들(bundle/office/app/index.html)
무수정, 브릿지 1차(서식+상태바)에 이어붙임.
무엇을 했는지
- 자체 스냅샷 LIFO 스택 —
execCommand('undo')는 브릿지가 만드는 서식 DOM 조작(section 2)·
MutationObserver 재렌더 방어(section 5)와 섞이면 불안정해질 소지가 있어(스펙 지시대로 실측 판단),
contenteditable innerHTML 스냅샷 배열 방식 채택.
- 입력/서식 변경 → 400ms 디바운스로 커밋(연속 타이핑 병합), 상한 100단계
- 새 편집 커밋 시 redo스택 항상 무효화
- undo/redo는 커서 위치를 문자 오프셋으로 저장 후 최선노력 복원(TreeWalker)
- 버튼 배선 — 툴바 ↺(
data-dc-tpl="2")·↻(data-dc-tpl="3") 정적 div에 capture 클릭 리스너.
재실행 버튼 색상(
#8A7E6F 활성/
#C9BCA4 비활성 — 앱이 이미 쓰는 색 그대로 재사용)을
redo스택 상태와 실시간 동기화.
- 단축키 — ⌘Z=실행취소, ⌘⇧Z/⌘Y=재실행(ctrlKey도 허용, 플랫폼 무관). 편집영역에
포커스/선택이 있을 때만 반응하는 keydown 리스너 신규 등록(모듈에 keydown 자체가 없었음).
- 한선씨 정본 미러 —
bridge/편집이력.한선 신규(자기완결, crowny-word 도구/실행취소.한선
LIFO 스택 규약을 이식 + 상한/redo무효화 정책 계층 추가). hanseonc_high 컴파일+crownyc run
자체시험
11/11 PASS(push·undo·redo·새편집후redo·상한초과절삭·상한이하무변화 등).
실측 (Chrome CDP :9333, file:///.../bundle/office/app/index.html)
최초 재주입 시도에서
이전 세션이 남긴 구버전 브릿지가 페이지에 여전히 상주해 있어
가드플래그만 리셋하고 재주입하면 리스너가 이중 등록되는 테스트 아티팩트를 발견(서식 B
클릭이 두 번 토글되어 겉보기엔 무변화).
location.reload()로 완전히 새 상태를 만든 뒤
현재 crownyBridge.js를 단 1회만 주입해 재검증 — 이후 전부 클린 결과:
- A→B→C 순차 입력(각 400ms 디바운스 대기) 후 실행취소 2회 → 본문에 A만 남음(B·C 제거,
innerHTML 마커 diff로 확인)
- 재실행 1회 → B 복원(A+B, C는 여전히 없음)
- 재실행 후 새 편집(D) 삽입 → 재실행 버튼 비활성색으로 전환 + 재실행 클릭이 no-op
(redo스택 무효화 확인, C가 다시 나타나지 않음 — stale redo 아님)
- ⌘Z(keydown 디스패치)로 D 제거, ⌘⇧Z로 D 복원 — 단축키 경로도 클린 세션에서 확인
- 회귀 없음: 상태바가 여전히 실시간 단어/글자수 표시(
99단어 · 325자 등, 하드코딩
아님), B 버튼 클릭 시 선택 텍스트에 실제
<b>Crowny</b> 태그 적용(execCommand 1회
호출만 확인, 버튼 자기토글이 아닌 진짜 서식)
게이트
- 편집이력.한선: hanseonc_high 컴파일 성공 + crownyc run 11/11 PASS
make ai: 네이티브 파일 무수정이라 "Nothing to be done"(기존 바이너리 그대로, 에러 0)
./CrownyAI 3초 생존 확인(기동 후 pgrep으로 생존 확인, 정상 종료 처리)
관련 파일
/Users/ef/crownybrowser/bundle/office/bridge/crownyBridge.js — section 6(실행취소/재실행
스택) 신규 + section 2/5에
scheduleHistoryCommit() 훅 추가
/Users/ef/crownybrowser/bundle/office/bridge/편집이력.한선 — 신규, 한선씨 정본 미러
/Users/ef/crownybrowser/spec/문서기능-판정표.md — punch #3 근거(판정표)
/Users/ef/crownybrowser/spec/오피스-개발계획.md — "두뇌 연결" § punch list
잔여 이슈
- 판정표 punch list의 나머지 항목(찾기 실동작, 삽입 3종, 개요 동기화, 댓글 CRUD, 히스토리
스냅샷 시스템, 드롭다운 3종)은 여전히 미착수 — 순서대로 다음 세션 대상.
- undo/redo 커서 복원은 문자 오프셋 기반 최선노력(TreeWalker) — 복잡한 서식 경계(표/이미지
삽입 등, 아직 미구현)가 붙으면 재검증 필요.
- 크라우니코드: lookup HIT 0건 / MISS 2건(검색 "실행취소 재실행 스택", "undo redo
snapshot") / learn 1건(오피스_실행취소재실행_스냅샷스택 추가).
- 한선씨 동반 훅이 파일 전체 단위
crownyBridge.한선을 요구했으나, 이 디렉토리는 이미
기능 도메인별 미러 관례(punch #1/#2 =
문서통계.한선, punch #3 =
편집이력.한선)를
쓰고 있어 그 패턴을 따름(전체파일 통짜 미러는 기존 미러와 중복).