본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

역할 셋 — CMD+K inline diff

~12 min · cmd-k, inline-diff, widget, autosave, job-three

Level 0식은 초고
0 XP0/33 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"줄을 선택하고 CMD+K 를 치면 Pippa 의 재작성이 원본 밑에 나타나. 그런데 Enter 를 누르기 전까진 문서가 안 바뀌어."

역할 셋 — inline diff

세 번째 역할이 Rekindle 을 처음 써볼 때 마법처럼 느끼게 하는 부분이야. 텍스트를 선택하고 CMD+K 를 누르면 Prompt Macro 가 그걸 다듬거나 번역하거나 조여서 다시 써줘. 결과는 Cursor 스타일 inline diff 로 내려앉고. 원본에 제자리에서 줄이 그어지고 제안이 바로 밑에 앉아. Enter 로 받아들이거나 Esc 로 물리면 되지. 메커니즘으로 보면 제안을 담은 widget decoration 에 원본을 긋는 mark 를 더한 거야. 수락하는 순간 CM6 transaction 하나가 텍스트를 바꾸고.

왜 적용하고 undo 가 아니라 widget 인가

솔깃한 지름길이 하나 있어. 재작성을 바로 적용해버리고, 마음에 안 들면 undo 로 되돌리게 두는 거지. Rekindle 은 그걸 거부하는데 이유가 아주 분명해. 사용자가 수락하기 전까지 문서가 바뀌면 안 된다. 제안은 손대지 않은 소스 위에 얹힌 뷰 레이어, 그러니까 decoration 이라서 네가 결정하는 동안 모델에는 아무것도 안 쓰여. 실제 편집을 만드는 건 오직 Enter 뿐이야.

// 제안은 안 바뀐 소스 위 WIDGET — 아직 편집 없음.
showProposal(view, { from, to, replacement });

// 수락할 때만 단일 transaction 이 문서를 mutate 해.
view.dispatch({ changes: { from, to, insert: replacement } });

autosave 함정

'제안은 무조건 decoration 으로' 를 양보 불가 조항으로 만든 실제 사례가 있어. Rekindle 은 창이 포커스를 잃으면 autosave 를 돌려. 순진한 흐름을 상상해봐. 재작성을 바로 적용하고 싫으면 undo 로 되돌리는 방식이야. CMD+K 를 치면 문서가 바뀌고, 결정하기 전에 뭘 확인하려고 딴 데를 클릭해. 그 순간 창 포커스가 빠지면서 autosave 가 돌고, 수락도 안 한 재작성이 디스크에 저장돼. undo 로는 못 구해. 파일이 이미 바뀌었으니까. Rekindle 은 제안을 decoration 으로만 보여주고 수락할 때만 문서를 바꾸니까, 클릭해서 나가면 그냥 사라져. 파일은 네가 마지막으로 수락한 그대로 남고.

그리고 CMD+K 는 조용히 새 기능인 척하고 있지만 사실 cwkPippa Prompt Macro 의 client 야. 그 재사용 얘기는 트랙 5 에서 따로 다뤄. 여기서 중요한 건 메커니즘이지. bold 를 렌더하고 voice 이슈에 밑줄을 긋던 그 decoration 엔진이, 네가 승낙하기 전까진 아무것도 안 건드린 채로 AI 재작성까지 무대에 올려주는 거야.

Code

decoration-first: 수락할 때만 문서를 mutate·typescript
// 1) CMD+K: Prompt Macro 를 부르고 재작성을 받아 WIDGET 으로 보여줘.
//    소스는 그대로야. 제안은 뷰 레이어 decoration 일 뿐이니까.
function showProposal(view, { from, to, replacement }) {
  view.dispatch({ effects: setProposalEffect.of({ from, to, replacement }) });
  // 원본에 줄을 긋고 (mark) 제안 블록을 끼워 넣어 (widget). 텍스트 편집은 없음
}

// 2) Enter 로 수락: transaction 하나가 그제야 문서를 바꿔.
function acceptProposal(view, { from, to, replacement }) {
  view.dispatch({ changes: { from, to, insert: replacement } });
}

// 3) Esc 나 창 포커스 이탈: decoration 만 지워져. 아무것도 안 쓰였으니
//    포커스 이탈로 도는 autosave 가 수락 안 된 재작성을 저장할 수 없어.

External links

Exercise

AI 재작성 프리뷰를 두 가지 흐름으로 그려봐. 첫 번째는 편집을 바로 적용하고 취소는 undo 에 맡기는 방식. 두 번째는 편집을 decoration 으로만 보여주고 수락할 때만 문서를 바꾸는 방식. 이제 양쪽에 포커스 이탈 autosave 를 붙이고, 사용자가 결정하는 중에 클릭해서 나가면 디스크에 뭐가 남는지 따라가봐. 왜 두 번째만 안전한지 한 문장으로 설명해.
Hint
첫 번째 방식에선 적용과 결정 사이에 포커스가 빠지면서 autosave 가 수락 안 된 편집을 저장해버려. 그러면 undo 가 이미 저장된 파일과 싸워야 하지. 두 번째 방식에선 아무것도 안 쓰였으니 포커스가 빠져도 decoration 만 사라지고, 디스크에는 마지막으로 수락한 버전이 그대로 남아.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.