에이전트가 고친 파일을 바로 보고 싶다면 Claude Code 의 PostToolUse 훅에서 orca file open <파일 경로> 를 부르면 됩니다. 이 명령은 지금 보는 화면을 바꾸지 않고 그 파일을 Orca 작업 폴더의 탭으로 열어 두기 때문에, 에이전트가 일하는 동안에는 방해가 없고 끝난 뒤에는 고친 파일이 탭으로 줄지어 있습니다. 훅이 느려지지 않게 명령은 분리된 백그라운드로 띄우고 결과는 기다리지 않는 것이 요령입니다.
이 글은 혼자 쓰는 개발 환경을 AI 에이전트 중심으로 바꾸면서(AX, AI 전환) 만든 장치를 하루에 하나씩 정리하는 연재의 두 번째 편입니다. 첫 편은 세션 이름을 훅이 먼저 붙이게 한 이야기였습니다.
왜 고친 파일을 매번 찾아다녔을까?
저는 Orca 라는 터미널 앱에서 Claude Code 세션을 띄워 두고 일을 맡깁니다. 에이전트는 파일을 읽고 고치고 다음 파일로 넘어가는데, 터미널에는 「이 파일을 고쳤다」는 한 줄만 남고 지나갑니다. 실제로 무엇이 바뀌었는지 보려면 그 경로를 눈으로 따라가 탐색기에서 폴더를 하나씩 펼쳐 파일을 찾아 열어야 했습니다. 고친 파일이 서너 개만 되어도 어느 것을 봤고 어느 것을 아직 안 봤는지 헷갈렸습니다.
처음 바란 모습은 무엇이었나?
처음 바란 것은 탐색기였습니다. 파일을 고치면 Orca 탐색기에서 그 경로가 펼쳐지고 파일이 표시되면 좋겠다고 생각했습니다. 그래서 Orca CLI 의 도움말부터 읽었습니다. orca file 아래에는 open(파일을 탭으로 열기), diff(변경 비교를 탭으로 열기), open-changed(git 으로 바뀐 파일을 모두 탭으로 열기) 세 가지가 있었고, 탐색기를 펼치는 명령은 없었습니다. 「탐색기에서 보기」는 화면 메뉴에만 있는 기능이라 훅에서 부를 방법이 없었습니다.
막힌 점은 무엇이었나?
목표를 조금 바꿨습니다. 제가 원한 것은 탐색기 자체가 아니라 「고친 파일이 눈앞에 있는 것」이었습니다. 파일의 상태(새로 생김·바뀜)를 색으로 보여 주는 일은 Orca 의 소스 컨트롤 목록이 이미 하고 있었습니다. 그래서 남은 일은 파일을 여는 것 하나로 줄었고, orca file open 이 그 일에 맞았습니다. 이 명령은 화면을 그 탭으로 옮기지 않고 열어만 두며, 옮기고 싶을 때만 --focus 를 붙입니다.
남은 걸림돌은 두 가지였습니다. 하나는 이 명령이 실행한 폴더(cwd)를 보고 Orca 작업 폴더를 찾는다는 점입니다. 엉뚱한 폴더에서 부르면 열 곳을 못 찾습니다. 다른 하나는 훅이 늦어지면 에이전트의 모든 편집이 그만큼 늦어진다는 점입니다.
훅으로 어떻게 바꿨나?
PostToolUse 훅은 도구 호출이 끝난 직후에 실행되고, 입력 JSON 에 도구 이름과 인자가 들어옵니다. 편집 도구일 때만 파일 경로를 꺼내고, 그 파일의 폴더를 cwd 로 삼아 명령을 띄웁니다. 실제 훅을 줄여 보면 이렇습니다.
TOOLS = {"Edit", "Write", "MultiEdit", "NotebookEdit"}
def target(payload, env):
if env.get("CC_EDIT_REVEAL", "1") == "0" or env.get("CLAUDE_CODE_ENTRYPOINT", "").startswith("sdk"):
return None # 끄기 스위치·무인 실행은 건너뛴다
if payload.get("tool_name") not in TOOLS:
return None
path = (payload.get("tool_input") or {}).get("file_path")
return path if path and os.path.isabs(path) and os.path.isfile(path) else None
subprocess.Popen([orca, "file", "open", path], cwd=os.path.dirname(path), start_new_session=True,
stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
start_new_session=True 로 훅과 분리된 프로세스로 띄우고 출력은 모두 버립니다. 훅은 Popen 을 부르자마자 {} 를 출력하고 끝나므로, Orca 가 탭을 여는 시간만큼 에이전트를 붙잡지 않습니다. 열 곳을 못 찾는 폴더(Orca 작업 폴더가 아닌 곳)에서는 명령이 조용히 실패하고, 훅은 그 결과를 보지 않으니 에이전트 쪽에는 아무 일도 일어나지 않습니다.
사람이 화면을 보지 않는 무인 실행(claude -p)은 열어 줄 사람이 없으니 건너뜁니다. 잠깐 끄고 싶을 때는 환경변수 CC_EDIT_REVEAL=0 하나면 됩니다. 등록은 설정 파일의 PostToolUse 에 한 줄입니다. 훅이 실패해도 빈 JSON 을 내도록 뒤에 || echo '{}' 를 붙여 두고, 시간 제한은 5초로 짧게 잡았습니다.
{
"hooks": {
"PostToolUse": [
{ "hooks": [{ "type": "command", "command": "python3 ~/.claude/hooks/edit_reveal.py 2>/dev/null || echo '{}'", "timeout": 5 }] }
]
}
}
지금 하루는 어떻게 달라졌나?
에이전트에게 일을 맡기고 다른 탭을 보다가 돌아오면, 고친 파일이 이미 탭으로 열려 있습니다. 경로를 따라 폴더를 펼칠 일이 없어졌고, 탭을 왼쪽부터 넘기며 읽으면 그것이 곧 이번 작업의 검토 순서가 됩니다. 탭이 화면을 빼앗지 않으니 에이전트가 일하는 중에 제가 보던 화면이 갑자기 바뀌는 일도 없습니다.
이 훅은 2026-10-19 에 52줄로 처음 들어갔고, 2026-10-20 기준으로 이 파일을 고친 커밋은 3개입니다. 처음 만들 때 정한 「탐색기 대신 탭」, 「기다리지 않고 띄우기」 두 가지는 그 뒤로 바뀌지 않았습니다.
자주 묻는 질문
파일을 고칠 때마다 화면이 그 탭으로 넘어가지 않나요?
넘어가지 않습니다. orca file open 은 기본이 「열기만 하고 화면은 그대로」이고, 화면까지 옮기려면 --focus 를 따로 붙여야 합니다. 훅에서는 붙이지 않습니다.
훅 때문에 에이전트의 편집이 느려지지는 않나요?
훅은 명령을 분리된 프로세스로 띄운 뒤 결과를 기다리지 않고 바로 끝납니다. 탭을 여는 데 걸리는 시간은 에이전트의 다음 동작과 상관이 없습니다.
Orca 가 아닌 터미널에서도 쓸 수 있나요?
구조는 그대로 쓸 수 있습니다. 훅에서 파일 경로를 꺼내는 부분은 Claude Code 기능이라 같고, orca file open 자리에 쓰는 편집기의 「파일 열기」 명령을 넣으면 됩니다. 다만 화면을 빼앗지 않고 여는 옵션이 있는지는 편집기마다 확인해야 합니다.