# ide-mod
Claude Code 안에 IDE 창을 띄우는 모드(function-hooks 플러그인)예요. 입력창 위에는 **이 세션의 컨텍스트·캐시 적중·생성 속도(tok/s)**와 **Claude·Codex·Antigravity 사용 한도**가 도트 게이지 한 줄로 늘 떠요. 창 위쪽에는 **에이전트 보드**가, 아래쪽에는 **파일 트리와 탭 에디터**가 있어요. 탭에서 **HWP·HWPX·PDF 문서**를 쪽 모양 그대로 열어 보고, 왼쪽 칸을 **이번 세션의 요청 기록**으로 바꿔 볼 수 있어요. 입력창 위에는 **강의 자막**과 **한국어 문체 게이트**가 떠요.
트리의 파일과 폴더는 `g`·`f` 한 번으로 **Mac의 실제 앱과 Finder**에서 열려요. 이 세션은 **링크 하나로 다른 컴퓨터에 넘길 수 있어요**(→ [다른 컴퓨터로 핸드오프](#다른-컴퓨터로-핸드오프)).

<sub>데모 녹화: [`docs/demo.tape`](docs/demo.tape) ([VHS](https://github.com/charmbracelet/vhs)) · 샘플 문서는 행정안전부 「2025년 주요업무 추진계획」(공공 문서)</sub>
```
에이전트 ● opus 5.5 1M · xhigh · 서브 1개 작업 중 / 1개 끝남 a: 보드 접기 h: 끝난 것 숨기기 s: 요약 끄기(haiku) x: 끝난 것 지우기
● 메인 opus 5.5 1M · xhigh 작업 중 3m12s · 도구 14 로그인 버그 고쳐줘
요약 인증 흐름을 서브에이전트에 나눠 조사하는 중
├─ ● Explore haiku 4.5 작업 중 34s · 도구 6 인증 코드 찾기
│ 지금 Grep login
└─ ✓ general-purpose sonnet 5.5 · medium 완료 1m02s 테스트 작성
결과 login.test.ts에 실패 케이스 3개 추가
──────────────────────────────────────────────────────────────────────────────
g: 앱으로 열기 f: 폴더 열기(src) t: 트리 접기 u: 상위 폴더 r: 새로고침 p: @프롬프트 c: 경로 복사 w: 탭 닫기
my-project 1-24/57 k ▲ j ▼ │ ▎app.ts ● README.md
▾ src/ │ src/app.ts · 1.2 KB · 1-21/88줄
▾ auth/ ● │ 1 import { login } from './auth'
login.ts ● │ 2
app.ts ● │ 3 export const answer = 42
▸ tests/ │ …
README.md │
```
## 설치
Claude Code 터미널 세션에서 아래 한 줄을 입력하세요.
```
/plugin install ide-mod --marketplace jkf87/ide-mod
```
마켓플레이스를 추가할지 물으면 `y`를 누르고 범위(user 권장)를 고르면 돼요. 설치한 세션에서 바로 동작해요.
> function hooks는 Claude Code의 early access API예요. 2.1.290에서 만들고 시험했어요. 버전이 바뀌면 API가 달라질 수 있어요.
## 쓰는 법
| 명령 | 하는 일 |
|---|---|
| `/ide` | IDE 창을 열어요 (처음엔 작업 폴더). 새 세션은 저절로 열려요 |
| `/ide auto on\|off` | 세션을 시작할 때 IDE 창을 저절로 열지 정해요 (기본 켜짐) |
| `/open <경로>` | 폴더면 트리의 뿌리로, 파일이면 탭으로 열어요. `~`, 상대 경로, `@경로` 모두 돼요 |
| `/lecture [on\|off]` | 강의 모드: Claude가 하는 일을 입력창 위에 쉬운 한국어 자막으로 보여줘요 |
| `/handoff [세션 이름] [메모]` | 이 세션을 다른 에이전트 세션에 넘겨요. 이름을 주면 그 세션에 핸드오프 글을 바로 보내고, 없으면 글을 보여 주고 핸드오프 화면을 열어요 |
| `/handoff share [메모]` · `publish` · `receive <링크>` | 다른 PC의 사람에게 넘겨요. share 한 번으로 인수인계서를 써서 비공개 Artifact에 올리고 링크를 보여 줘요. publish는 다시 게시, 받는 사람은 receive로 입력창에 받아요 |
| `/cache [now\|keep 2h\|off]` | 프롬프트 캐시 수명과 유지 상태를 보고, 지금 살리거나 유지 시간을 바꿔요 |
| `/limits [line\|rows\|off\|refresh]` | 입력창 위 사용 한도 띠의 모양을 바꾸거나 지금 다시 받아요. 인자 없이 치면 현재 값을 글로 보여 줘요 |
| `/style-gate [파일\|on\|off]` | 한국어 원고의 AI티 지표를 검사해요. 켜 두면 Claude가 `.md`·`.txt`를 쓸 때마다 자동으로 검사해요 |
전체 화면 레이아웃(fullscreen)에서 쓰면 창이 대화 옆에 넓게 붙어서 IDE처럼 보여요. 창 크기는 직접 끌어서 바꿀 수 있어요.
### 파일·폴더를 실제 앱으로 열기 (`g`·`f`)
툴바 맨 앞에 두 버튼이 늘 떠 있어요.
```
g: 앱으로 열기 f: 폴더 열기(src) t: 트리 접기 …
```
| 키 | 하는 일 |
|---|---|
| `g` | 지금 탭에 열린 파일을 **그 파일의 기본 앱**으로 열어요. `.hwpx`는 한컴, `.pptx`는 키노트·파워포인트, `.pdf`는 미리보기처럼 Mac에서 더블클릭했을 때와 같아요 |
| `f` | 트리에서 마지막으로 누른 폴더를 **Finder**로 열어요. 괄호 안이 열릴 폴더 이름이고, 그 폴더 줄은 색으로 표시돼요. 폴더를 고르지 않았으면 지금 파일이 든 폴더를 열고 그 파일을 골라 보여 줘요 |
- 단축키는 창(IDE 창)을 한 번 누른 뒤에 먹어요. 입력창에 글을 쓰는 중에는 글자로 들어가요.
- 트리에서 같은 줄을 1.2초 안에 두 번 눌러도 열려요. 다만 터미널은 빠른 더블클릭을 글자 선택·복사로 가져가서 모드가 받지 못해요. 터미널에서는 단축키가 확실해요.
- macOS는 `open`, Linux는 `xdg-open`, Windows는 탐색기로 열어요.
### 다른 컴퓨터로 핸드오프
하던 작업을 **다른 컴퓨터의 Claude Code로 넘길 수 있어요**. 내 다른 맥으로 옮겨 가서 이어 해도 되고, 다른 사람에게 넘겨도 돼요. 대화 기록 파일을 옮기는 게 아니라, Claude가 이 대화를 읽고 쓴 **인수인계서**를 비공개 Artifact 링크 하나로 넘기는 방식이에요.
**보내는 컴퓨터**
1. 받는 쪽이 코드를 받을 수 있게 먼저 **commit과 push**를 해 두세요. 넘어가는 것은 원격(GitHub 등)에 있는 코드와 인수인계서뿐이에요. 이 PC의 파일은 넘어가지 않아요.
2. IDE 창에서 `i`(핸드오프)를 누른 뒤 `f`(다른 사람에게)를 눌러요. 또는 입력창에 `/handoff share`를 쳐요. 뒤에 메모를 붙일 수 있어요: `/handoff share 로그인 테스트부터 이어서`.
3. Claude가 인수인계서(목표·한 일·결정과 이유·남은 일·주의할 점·관련 링크)와 git 위치(원격·브랜치·최근 커밋)를 써서 게시하고, **링크를 클립보드에 복사해** 줘요. push 안 한 커밋이 있으면 화면에 알려 줘요.
4. 링크를 열어 내용을 한 번 확인하세요.
- **내 다른 컴퓨터**로 옮길 때: 같은 claude.ai 계정이면 공유 설정 없이 그대로 열려요.
- **다른 사람**에게 줄 때: 링크는 처음에 나만 볼 수 있어요. 페이지의 공유 메뉴에서 받을 사람에게 공유한 뒤 링크를 보내세요.
**받는 컴퓨터**
1. 저장소를 clone(또는 pull)하고 그 폴더에서 Claude Code를 켜요.
2. ide-mod가 있으면 `/handoff receive <링크>`를 입력해요. 인수인계서가 **입력창에 들어가기만** 하고 보내지지는 않아요. 읽어 보고 Enter를 누르면 Claude가 이어서 일해요.
3. ide-mod가 없으면 링크 페이지의 **받기 프롬프트 복사** 버튼을 눌러 Claude Code 입력창에 붙여 넣으면 돼요. 받는 쪽에는 ide-mod가 없어도 돼요.
비밀번호·토큰·API 키·IP·이메일은 쓰지 않게 하고, 쓴 뒤에 한 번 더 걸러 `[비공개]`로 가려요. 내가 보낸 요청 원문과 커밋하지 않은 변경 내용도 싣지 않아요. 같은 컴퓨터의 다른 세션에 넘기는 방법은 아래 [핸드오프](#핸드오프-i)에 있어요.
### 사용 한도 띠 (입력창 위)
이 세션과 모든 사용 한도를 **한 줄**에 도트 게이지로 보여 줘요.
```
세션 컨텍스트 ⣿⣀⣀⣀ 18% 캐시 ⣿⣿⣿⡇ 94% 114 tok/s │ Claude 5h ⣀⣀⣀⣀ 4% 주 ⣿⣿⣿⣿ 96% 2일 Fable ⣿⣿⣀⣀ 54% │ Codex 주 ⣿⣿⣿⣀ 78% 4일 │ Gemini 5h ⣀⣀⣀⣀ 5% 주 ⡇⣀⣀⣀ 9% │ AG Claude·GPT …
```
- **세션**: 컨텍스트 창 사용률, 마지막 응답의 프롬프트 캐시 적중률, 출력 속도(tok/s). 메인 에이전트의 응답이 끝날 때마다 그 응답의 토큰 수로 바로 고쳐요.
- **Claude**(5시간·주간·모델별 주간), **Codex**, **Gemini**·**AG Claude·GPT**(Antigravity의 5시간·주간).
- 게이지는 점자 점으로 그린 도트 막대예요. 사용률 게이지는 칸마다 초록→노랑→빨강으로 물들고, 캐시 게이지는 80% 이상 초록·50% 밑 빨강이에요. 70% 넘게 쓴 창에는 리셋까지 남은 시간(`2일`)이 붙어요.
- 줄이 화면보다 길면 오른쪽 묶음부터 게이지를 빼고 숫자만 남겨요.
- Claude는 세션의 자격 증명으로 Claude Code의 `/usage`와 같은 사용량 응답을 1분마다 받아요(토큰은 mod에 보이지 않아요). 못 받으면 엔진이 응답마다 주는 5시간·주간 한도를 써요.
- Codex는 Codex CLI의 앱 서버(`codex app-server`)에 5분마다 물어요. Antigravity는 `bin/agy-usage.sh`가 `agy /usage`를 부르는데, 결과를 `~/.cache/ide-mod`에 두고 모든 세션이 15분 동안 나눠 써요. agy 로그인 토큰을 갱신하는 주소의 DNS가 안 풀리면 agy를 띄우지 않고, 실패하면 30분 쉬어요. 세션마다 자주 띄우면 토큰 갱신이 실패할 때마다 agy가 인증 코드를 묻기 때문이에요. 설치돼 있지 않으면 그 묶음은 나오지 않아요.
- 띠가 화면에 있을 때만 받아요. `/limits rows`로 출처마다 한 줄(막대·리셋 시각), `/limits line`으로 다시 한 줄, `/limits off`로 숨겨요.
### 캐시 유지 (`/cache`)
프롬프트 캐시는 마지막 요청 뒤 수명(구독은 보통 1시간, API 키는 5분)이 지나면 사라져요. 그다음 요청은 대화 전체를 다시 캐시에 써야 해서 느리고 비싸요.
- 띠의 `캐시 99% 52분`에서 뒤 숫자가 캐시가 사라지기까지 남은 시간이에요. 사라지면 `만료`가 노랗게 떠요.
- 쉬는 동안 수명이 끝나기 직전(1시간 수명이면 5분 전, 5분 수명이면 1분 전)에 메인 대화의 마지막 요청을 그대로 한 번 더 보내요(`$.model.fork`). 캐시에서 읽히면서 수명이 다시 시작돼요.
- 쉬기 시작한 뒤 2시간까지만 살려 둬요. 대화가 2만 토큰 밑이면 다시 쓰는 값이 작아서 건드리지 않아요.
- 유지 요청 한 번은 대화 전체를 캐시에서 한 번 읽는 값(입력 단가의 약 10%)과 짧은 답 몇 토큰이 들어요. 구독이면 사용 한도에 조금 잡혀요.
- 캐시 수명은 처음엔 구독 여부로 추정하고, 쉬었다 보낸 요청이 캐시에서 읽혔는지를 보고 실제 값으로 고쳐요.
- `/cache` 상태 보기, `/cache now` 지금 한 번 살리기, `/cache keep 2h` · `90m` · `off`로 유지 시간 바꾸기.
### agy(Antigravity CLI) 상태줄
agy에도 같은 도트 게이지 한 줄을 띄울 수 있어요. agy 안에서 한 번 입력하세요.
```
/statusline node ~/ide-mod/bin/agy-statusline.mjs
```
```
Gemini 3.8 Flash 컨텍스트 ⡇⣀⣀⣀ 12% 작업 중 │ Gemini 5h ⣀⣀⣀⣀ 3% 주 ⡇⣀⣀⣀ 13% │ AG Claude·GPT 5h 0% 주 2% │ Claude 5h 3% 주 98% 1일 │ Codex 주 82% 3일
```
- agy가 상태줄에 넘겨주는 모델·컨텍스트·Antigravity 한도를 그대로 써요. agy를 따로 띄우지 않아요.
- 현재 세션의 `핸드오프 agy --conversation <세션 ID>`도 표시해요. 다른 터미널에서 명령을 실행하면 해당 대화를 이어받아요. 창이 좁으면 사용량 묶음을 줄이고, 더 좁으면 전체 세션 ID를 우선 표시해요. ID는 현재 agy가 넘긴 값만 사용해요.
- Claude·Codex 한도는 ide-mod가 `~/.cache/ide-mod/limits.json`에 남긴 값을 읽어요(30분 넘은 값은 안 써요).
- 거꾸로 agy가 준 Antigravity 한도를 `~/.cache/ide-mod/agy-usage.tsv`에 남겨서, agy를 쓰는 동안에는 ide-mod도 agy를 띄우지 않고 이 값을 써요.
- 경로는 ide-mod를 받은 폴더에 맞게 바꾸세요. 되돌리려면 `/statusline delete`.
### 시스템 상태 (보드 맨 위)
- 메모리 사용량과 **메모리 압력**(정상·경고·위험), **스왑** 사용량, **디스크** 사용률과 남은 용량을 한 줄로 보여 줘요. 보드가 떠 있을 때만 10초마다 다시 읽어요.
- 압력이 경고면 노랑, 위험이면 빨강이에요. 스왑이 램의 15%를 넘으면 노랑, 50%를 넘으면 빨강, 디스크가 90%를 넘으면 노랑, 95%를 넘으면 빨강이에요.
- `z`를 누르면 **메모리를 많이 쓰는 앱** 6개를 보여 줘요. 앱의 도우미 프로세스는 앱 이름으로 묶어요(Google Chrome Helper → Google Chrome).
- macOS는 `sysctl`·`vm_stat`·`df`·`ps`로, Linux는 `/proc/meminfo`로 읽어요. 보드를 접어도 이 줄은 남아요.
### 에이전트 보드 (위쪽)
- 메인 에이전트와 서브에이전트를 **누가 누구를 띄웠는지에 따라 트리로** 보여줘요. 팀원이나 손자 에이전트까지 나와요.
- 에이전트마다 **모델·effort**(실제로 보낸 모델 요청 기준), **역할**(서브에이전트 타입, 팀원 이름), **맡은 작업**, **지금 하는 일**(마지막 도구 호출), 경과 시간과 도구 호출 수를 보여줘요.
- **요약**: 보드가 화면에 떠 있을 때만 20초마다 새 활동이 쌓인 에이전트를 haiku로 한 줄 요약해요. 끝난 에이전트는 답의 첫 줄을 보여줘요.
- 요약은 계정 사용량을 써요(20초에 최대 3번, 짧은 호출). `s`로 끌 수 있고, 3번 연속 실패하면 스스로 꺼져요.
- 서브에이전트가 돌 때는 상태줄에 `◆ opus 5.5 · xhigh ⇉ 서브에이전트 N개 작업 중`이 떠요.
- 단축키: `z` 메모리 많이 쓰는 앱, `i` 핸드오프, `a` 보드 접기/펼치기, `h` 끝난 것 숨기기(돌고 있는 자손은 남아요), `s` 요약 켜기/끄기, `x` 끝난 것 지우기
### 탐색기 (아래쪽)
- 폴더(▸)를 누르면 그 자리에서 펼쳐지고, 파일을 누르면 오른쪽에 탭으로 열려요. 탭은 최대 8개예요. 심볼릭 링크 폴더도 펼쳐져요.
- 코드는 문법 하이라이트와 줄 번호로 보여줘요. 마크다운은 `m`을 누르면 렌더 화면으로 바뀌어요.
- **스크롤**: 휠은 마우스가 올라간 쪽(트리 또는 파일)만 움직여요. 방향키는 열린 파일을 움직이고, 열린 파일이 없으면 트리를 움직여요. `j`/`k`는 트리를 반 화면씩 넘겨요. 끝에 닿았거나 움직일 게 없으면 휠을 앱에 돌려줘서 데스크톱 앱의 대화가 그대로 스크롤돼요. 최근 휠 40개는 `~/.cache/ide-mod/scroll.log`에 남아요(스크롤 문제를 볼 때).
- **실제 앱으로 열기**: `g`는 지금 파일을 기본 앱으로, `f`는 고른 폴더를 Finder로 열어요(→ [파일·폴더를 실제 앱으로 열기](#파일폴더를-실제-앱으로-열기-gf)). 같은 줄을 1.2초 안에 두 번 눌러도 열려요. 누름 기록은 `~/.cache/ide-mod/press.log`에 남아요.
- **Claude가 고친 파일**은 트리와 탭에 `●`이 붙고, 열려 있으면 다시 읽어요. 거절되거나 실패한 수정은 표시하지 않아요.
- **데스크톱 앱**에서는 버튼이 글자 칸보다 넓은 네이티브 버튼으로 그려져요. 그래서 시스템 줄·보드 머리줄·툴바·탭 줄을 한 행에 가두지 않고 다음 줄로 감싸고, 늘어난 만큼 탐색기를 줄여요.
- 폭이 70칸보다 좁으면 트리와 파일을 번갈아 보여줘요. 파일을 고르면 파일 화면으로 넘어가고, `t`를 누르면 트리로 돌아와요.
- 단축키: `t` 트리 접기, `q` 파일 트리/요청 기록, `l` 요청 모두 보기/하나만, `v` 요청 전체 세션/이 세션(요청 기록에서), `u` 상위 폴더, `r` 새로고침, `m` 렌더/원문, `v` HWP 문서/그림 보기, `e` HWP 편집 창, `o` HWP 미리보기로 열기, `b`·`n` HWP 앞뒤 쪽, `p` 입력창에 `@경로` 넣기, `c` 경로 복사, `w` 탭 닫기, `g` 기본 앱으로 열기, `f` 폴더를 Finder로 열기
### HWP·HWPX·PDF 뷰어 (rhwp·pdf.js 엔진)
- 트리에서 `.hwp`·`.hwpx`·`.pdf`를 누르면 탭으로 열려요. HWP 엔진은 [rhwp](https://github.com/edwardkim/rhwp)(Rust→WASM, MIT, `vendor/rhwp`), PDF 엔진은 [pdf.js](https://github.com/mozilla/pdf.js)(Apache-2.0, `vendor/pdfjs`)예요. 둘 다 같은 문서 보기 렌더러(`bin/grid.mjs`)를 써요.
- PDF는 pdf.js가 꺼낸 글자 좌표와 선(획·얇은 막대)으로 문서 보기를 만들고, 그림 보기는 poppler의 `pdftoppm`으로 만들어요(`brew install poppler`). `o`는 PDF 원본을 미리보기로 바로 열어요.
- **문서 보기**(기본): rhwp가 그린 쪽을 창 너비에 맞춘 글자 격자로 다시 그려요. 가운데 정렬 제목, 번호 상자, 표 테두리(┌┬┐├┼┤└┴┘), 굵은 글씨, 글자색, 가운뎃점을 쪽 모양 그대로 보여주고, 칸을 넘는 글은 `…`로 줄여요. 그래픽이 없는 터미널(macOS 터미널 등)에서도 HWP 모양으로 보여요. 쪽 끝까지 내리면 다음 쪽으로 넘어가요.
- **그림 보기**(`v`): rhwp가 그린 실제 쪽 그림이에요. 터미널은 PNG(kitty·Ghostty 같은 그래픽 터미널), 데스크톱 앱은 SVG로 그려요.
- **편집**(`e`): 브라우저 앱 창(Chrome·Edge·Brave, 없으면 기본 브라우저)에 [rhwp 편집기](https://www.npmjs.com/package/@rhwp/editor)(MIT, `vendor/rhwp-editor`)를 띄워 메뉴·툴바·표 편집까지 위지윅으로 고쳐요. 위 막대의 **저장**(막대를 누른 뒤 ⌘S/Ctrl+S도 돼요)을 누르면 원래 파일에 다시 쓰고, IDE 창의 보기도 새로 읽어요.
- 편집기 화면(rhwp-studio)은 `edwardkim.github.io/rhwp`에서 받아 와서 인터넷이 필요해요. 문서는 브라우저 안에서만 다루고, 이 컴퓨터의 작은 서버(`bin/rhwp-edit.mjs`, 127.0.0.1·무작위 토큰 주소)가 파일을 읽고 써요. 창을 닫으면 30초 뒤 서버도 끝나요.
- 덮어쓰기 전에 디스크의 이전 판을 `~/.cache/ide-mod/hwp-backup/`에 남겨요.
- `.hwp`는 저장한 것을 다시 읽어 쪽 수가 그대로일 때만 덮어써요. 아니면 **HWPX로 따로 저장**을 쓰세요(같은 이름의 `.hwpx`).
- 편집기 안의 단축키는 rhwp 편집기 것이에요. 한컴 단축키와 다를 수 있어요.
- **미리보기로 열기**(`o`): 지금 쪽을 그림으로 만들어 macOS 미리보기로 열어요. 한컴에서 보는 모양 그대로 확인할 때 써요.
- `b`/`n`으로 앞뒤 쪽을 넘기고, 치환이 안 된 `{{키}}` 칸은 빨갛게 표시하고 개수를 위에 보여줘요.
- 엔진은 플러그인의 `bin/rhwp-view.mjs`를 **Node.js**로 실행해요. 그림 변환은 `rsvg-convert` → `resvg` → macOS `qlmanage`+`sips` 순서로 있는 것을 써요.
### 핸드오프 (`i`)
- 보드 맨 위에 이 세션의 ID(앞 8자리)가 떠요. `i`를 누르면 탐색기가 핸드오프 화면으로 바뀌어요.
- 왼쪽에는 지금 열려 있는 다른 Claude 세션(데스크톱 앱·터미널)이 나와요. 세션을 누르면 오른쪽 핸드오프 글을 그 세션에 메시지로 보내요. `r`로 목록을 새로 받아요.
- 핸드오프 글에는 세션 ID, 작업 폴더, 대화 기록 파일 경로, 이어서 여는 명령(`claude --resume <ID> --fork-session`), **사용자가 보낸 요청**(최근 20개, 시각과 함께), 에이전트가 마지막에 하던 일이 들어가요. 받은 쪽은 대화 기록을 읽고 이어서 일해요.
- `c` 핸드오프 글 복사(Codex 같은 다른 에이전트에 붙여 넣을 때), `y` 세션 ID만 복사, `e` 이어서 열기 명령 복사.
- 세션 목록은 Claude Code의 ListAgents 도구로 받고, 보내기는 `$.session.send`를 써요.
#### 다른 사람에게 (`f`)
단계별 사용법은 위 [다른 컴퓨터로 핸드오프](#다른-컴퓨터로-핸드오프)를 보세요. 여기는 자세한 동작이에요.
다른 PC의 사람은 이 세션의 대화 기록도, 이 PC의 파일도 볼 수 없어요. 그래서 대화를 보고 쓴 **인수인계서**와 **git 위치**를 한 페이지에 담아 Artifact로 넘겨요.
- 핸드오프 화면에서 `f`를 누르면 오른쪽이 "다른 사람에게"로 바뀌고, **바로 인수인계서를 써서 게시하고 링크를 보여 줘요**. Claude가 이 대화를 다시 읽고(`$.model.fork`, 지금 세션의 캐시를 그대로 써요) 목표·한 일·결정과 이유·남은 일·주의할 점·관련 링크로 써요. `w`는 다시 써서 새 링크를 만들어요.
- 비밀번호·토큰·API 키·세션 키·IP·이메일은 쓰지 말라고 시키고, 쓴 뒤에 한 번 더 걸러서 `[비공개]`로 가려요. 원격 주소에 섞인 계정·토큰도 빼요. 사용자가 보낸 요청 원문과 커밋하지 않은 변경 내용은 싣지 않아요(변경된 파일 목록만 넣어요).
- 링크는 **비공개 Artifact**라 공유하기 전에는 나만 열 수 있어요. 페이지에서 내용을 확인한 뒤 claude.ai 페이지의 공유 메뉴에서 받을 사람과 공유하세요. 링크는 클립보드에 복사되고 오른쪽 맨 위에도 남아요. `c`로 다시 복사하고, 게시가 실패했으면 `o`로 다시 게시해요.
- `/handoff share [메모]`도 한 번에 써서 게시하고, 첫 줄에 링크를 보여 줘요.
- push하지 않은 커밋이나 원격에 없는 브랜치가 있으면 왼쪽에 알려 줘요. 받는 사람은 원격에 있는 코드만 받을 수 있어요.
- 받는 사람은 Claude Code에서 `/handoff receive <링크>`를 입력해요. 페이지에 함께 올린 `handoff.json`을 읽어 **입력창에 넣기만** 하고 보내지는 않아요. 남이 쓴 글이라 직접 읽고 Enter를 누르게 하고, 그 안의 지시를 따르지 말라는 말도 앞에 붙여요. ide-mod가 없으면 페이지의 **받기 프롬프트 복사**를 눌러 붙여 넣으면 돼요.
- 게시할 파일은 Claude의 스크래치패드에 두고, 찾지 못하면 작업 폴더의 `.claude/ide-mod-handoff/`에 둬요.
### 요청 기록 (`q`)
- 이번 세션에서 **사람이 보낸 요청**(입력창·원격 조종·SDK)이 번호·시각·상태(● 진행 중, ✓ 끝남, ■ 중단)와 함께 왼쪽 칸에 쌓여요. 백그라운드 작업 알림이나 다른 세션이 보낸 메시지는 넣지 않아요. 최근 요청이 맨 위예요.
- **모두 보기**(기본): 오른쪽 칸에 이번 세션 요청 전부를 전문 그대로 이어서 보여 줘요. 요청마다 시각·상태·걸린 시간과 Claude 답의 첫 줄이 붙어요. 내가 무슨 말을 했는지 한눈에 훑어볼 때 써요. `c`로 전부 복사해요.
- **두 가지 범위**: `v`로 **전체 세션**(기본: 같은 폴더의 지난 세션과 agy·Codex 프롬프트까지)과 **이 세션만**을 오가요. 왼쪽 칸 맨 위에 지금 범위와 개수(`전체 세션 요청 110개`, `이 세션 요청 12개`)가 보여요. 모두 보기·복사도 고른 범위만 다뤄요.
- 요청을 누르면 그 요청 하나만 펼쳐요. `p`로 입력창에 다시 넣고, `c`로 복사해요. `l`로 모두 보기와 하나만 보기를 오가요.
- 세션별로 저장돼서 모드를 다시 불러오거나 세션을 이어 열어도 남아요. 최근 40개 세션까지 보관해요.
- agy(Antigravity CLI)와 Codex에 보낸 같은 폴더의 프롬프트도 `agy`·`Codex` 표시를 달고 시간순으로 섞여 나와요. agy는 `~/.gemini/antigravity-cli/history.jsonl`을, Codex는 스레드 목록(`~/.codex/state_*.sqlite`)에서 사람이 연 CLI·데스크톱 스레드만 골라 대화 파일에서 사람이 보낸 메시지만 읽어요(서브에이전트·`codex exec`는 빼요).
- agy에서는 **`/prompts`** 명령으로 봐요(`/prompts 100`, `/prompts --all`). 설치: `ln -s ~/ide-mod/agy/skills/prompts ~/.gemini/config/skills/prompts`. agy의 `/` 명령은 스킬이라 모델이 한 번 명령을 실행해 결과를 그대로 보여 줘요. 실행 때마다 묻지 않게 하려면 agy 설정 `permissions.allow`에 `command(node ~/ide-mod/bin/prompts.mjs)`를 넣으세요.
- agy 안이나 아무 터미널에서 `node ~/ide-mod/bin/prompts.mjs`를 실행하면 이 폴더에서 Claude·Codex·agy에 보낸 프롬프트를 시간순으로 찍어 줘요. agy에서는 `!node ~/ide-mod/bin/prompts.mjs`처럼 `!`를 붙이면 모델을 거치지 않아요. `100`으로 개수, `--all`로 모든 폴더, `--only codex,agy`로 도구 고르기.
- 세션을 껐다가 **새 세션**을 열어도, 같은 폴더에서 연 지난 세션 5개의 요청(최대 200개)이 `↺` 표시와 날짜를 달고 이번 세션 요청 앞에 이어져요. 모두 보기에서는 세션마다 `── 지난 세션 <ID> ──` 줄로 나눠요.
### 작업 진행 (창 맨 아래)
Claude가 할 일 목록 도구(`TaskCreate`·`TaskUpdate`·`TodoWrite`)로 일을 나누면, IDE 창 맨 아래에 진행률이 떠요. 할 일이 없으면 아무것도 그리지 않아요.
```
작업 진행 ███░░░░░░░ 33% 완료 1 · 진행 중 1 · 대기 1
◐ 진행 중 요약 문장 만들기
○ 대기 그래프 그리기
✓ 완료 엑셀 불러오기
```
- 진행 중 → 대기 → 방금 끝난 것 순서로 최대 5줄까지 보여 주고, 넘치면 `… 외 N개`로 줄여요. 탐색기는 10행 이상 남겨요.
- 서브에이전트의 `TodoWrite`는 메인 목록을 덮지 않아요. 거절되거나 실패한 호출은 반영하지 않아요.
### 입력창 위: 강의 자막과 문체 게이트
- **강의 자막**(`/lecture`): "파일을 읽고 있어요 · login.ts", "터미널에서: 테스트 실행"처럼 지금 하는 일과 방금 한 일, 단계 수, 경과 시간, 일하는 서브에이전트 수를 테두리 상자에 보여줘요. 모델 호출 없이 도구 호출만으로 만들어요.
- **문체 게이트**(`/style-gate`): noslop-ko의 결정적 패턴 16개(대조 구문, 접속어 뒤 쉼표, 맺음 상투어, 과장 어휘, 번역투 등)를 세서 통과·경고·중단을 판정해요. 경고 이상이면 입력창 위에 뜨고, `g`로 예문을 펼치고 `d`로 닫아요. 한글이 50자 넘는 원고만 검사하고 코드 블록은 빼요.
- 다른 모드가 입력창 위에 그리는 띠(예: usage-band)는 그 아래에 그대로 둬요.
패널에 포커스가 있을 때(클릭하거나 ctrl+x tab) 단축키가 먹어요. Esc를 누르면 입력창으로 돌아가요.
## 한계
- **보기 전용**이라 편집은 Claude에게 시키거나 실제 에디터에서 하세요.
- **이미지**: PNG만, kitty·Ghostty처럼 그래픽 프로토콜을 지원하는 터미널에서만 보여요. HWP 페이지 그림도 같아요.
- **HWP**: Node.js가 있어야 해요. 데스크톱 앱은 쪽 SVG를 줄여서(글꼴 목록을 스타일 한 줄로, 좌표 소수 한 자리) 그리는데, 그래도 128K자를 넘는 쪽은 문서 보기를 써요.
- **큰 파일·폴더**: 4 MB가 넘는 파일은 열지 않아요. 트리는 3,000줄까지만 펼쳐요.
- **렌더된 마크다운**은 문단 단위로 스크롤돼요.
- **바깥 수정**: Claude 밖(내 에디터)에서 고친 파일은 `r`을 누르거나 다음에 다시 그려질 때 반영돼요.
- **UI 언어**: 화면 문구는 한국어예요.
## 개발
```
claude plugin validate . # 매니페스트·훅 모듈 검사
claude plugin test . # tests/*.test.tsx
claude --plugin-dir . # 이 폴더를 그대로 로드해서 써 보기
```
타입 정의(`.claude-plugin/types/`)와 `tsconfig.json`은 Claude Code가 이 폴더를 한 번 로드할 때 깔아 줘요. 그 뒤에 `npx tsc -p .`로 타입 검사를 할 수 있어요. 둘 다 `.gitignore`에 들어 있어요.
구조는 `hooks/register.tsx` 파일 하나예요. 엔진이 `$`를 같은 파일 안의 함수로만 따라가서, 보드와 탐색기를 한 파일에 나눠 적었어요.
## License
MIT. 함께 들어 있는 rhwp(`vendor/rhwp`)는 Edward Kim의 MIT 라이선스, pdf.js(`vendor/pdfjs`)는 Mozilla의 Apache-2.0 라이선스예요.