tmux 상태줄에 AI 에이전트 작업 상태를 직접 표시하기
여러 AI 코딩 에이전트를 tmux 창에 나눠 띄워 쓰다 보면, 어느 창이 아직 작업 중이고 어느 창이 결정을 기다리고 있으며 어느 창이 끝났는지 확인하려고 매번 창을 옮겨 다니게 된다. 이 문제를 별도 사이드바가 아니라 tmux 상태줄의 창 목록 자체에 아이콘으로 얹는 설정이 공개됐다. 이미 쓰고 있는 상태줄 포맷 문자열에 상태를 실어 보내는 방식이다.
상태는 세 가지로 나뉜다. 작업 중(working), 결정 대기(action), 유휴(idle)다. 참고한 도구 중 하나는 "다른 곳을 보고 있는 동안 끝난" 완료 상태까지 추적했지만, 그건 패널별 포커스 이력을 요구하기 때문에 여기서는 제외했다.
처음에는 두 가지 신호가 후보로 검토됐고, 둘 다 실패했다. 첫째는 pane_title이다. tmux가 패널 단위로 추적하고 프로그램이 OSC 시퀀스로 설정하는 값이라 가장 그럴듯해 보인다. 실제로 grok은 제목에 점자 스피너를 넣어 계속 갱신한다. 반면 Claude Code의 제목은 전혀 변하지 않았다. 초당 두 번씩, 전체 작업 턴에 걸쳐 샘플링해도 서로 다른 값이 두 개 나올 뿐이었다. 결국 제목 규칙은 grok에는 먹히고 Claude에는 아무 일도 하지 않는 규칙이 된다.
둘째는 pane_current_command인데, 이것도 틀린 대상을 가리킨다. 두 CLI 모두 버전이 붙은 바이너리를 가리키는 심볼릭 링크를 통해 실행되기 때문에 프로세스가 그 파일명을 달고 나타난다. ~/.local/bin/claude는 ~/.local/share/claude/versions/2.1.273을, ~/.grok/bin/grok은 ../downloads/grok-1.0.30-macos-aarch64를 가리킨다. 그래서 grok은 grok-1.0.30-mac으로 잘려 보이고, 초록 아이콘이 켜지지 않던 이유도 여기서 설명된다. 대신 패널의 프로세스 트리를 ps -o comm=로 훑으면 진짜 이름이 나온다. 다만 이 방법은 "어떤 에이전트인가"만 답하고 "무엇을 하는 중인가"는 답하지 않는다.
그래서 상태 판정은 화면 스크래핑으로 넘어간다. agenmux가 문서화한 대로 감지는 스크래핑 전용이며, 에이전트 식별은 프로세스 트리를 걷고 상태 추론은 패널의 보이는 화면과 제목에서 얻는다. Claude Code가 작업 중일 때 화면에는 인터럽트 힌트가 뜨는데, 이 문구는 무언가를 중단시킬 수 있는 동안에만 렌더링된다. 스피너 문자도 점자 집합이 아니라 다른 계열이다.
규칙의 검사 순서는 에이전트마다 다르고, 이 순서가 결과를 좌우한다. Claude는 작업 중 판정을 먼저 보고, 이미 응답한 권한 프롬프트가 화면에 남아 있어도 대기로 읽히지 않도록 맨 프롬프트 유휴 규칙을 차단 패턴보다 앞에 둔다. Codex와 grok은 반대로 차단 상태를 먼저 검사한다. grok의 [stop] 표시는 한 턴 내내 유지되는 유일한 마커인데, 긴 도구 호출 중에는 스피너 텍스트가 멈추고 취소 힌트가 두 가지 표기 사이를 오가며, 승인 프롬프트에서도 화면에 남기 때문에 차단 우선 검사가 강제된다.
폴러는 1초에 한 번 각 패널의 판정 결과를 패널 스코프 옵션에 기록하고, 상태줄 포맷 문자열은 그 값을 읽어 색과 기호를 고른다. 결정 대기는 빨간 느낌표, 작업 중은 노란 원, 유휴는 초록 체크다. 창 포맷과 현재 창 포맷 두 줄을 모두 정의해야 한다. tmux가 현재 창을 별도의 포맷으로 렌더링하기 때문이다. 초기 버전은 포맷 문자열 안의 #()로 스크립트를 호출했지만 이 방식은 동작하지 않는다. #()는 다음 리드로우까지 결과가 캐시되는 잡이라, 분리된 세션에서는 갱신이 일어나지 않는다. 그래서 백그라운드 루프로 옮겼다.
한계도 분명하다. 창 목록은 창당 아이콘 하나를 활성 패널 기준으로 보여주기 때문에, 한 창을 분할해 두 에이전트를 돌리면 둘 중 하나만 드러난다. 에이전트 세 개에 규칙 세트 세 개가 필요하고, 그 규칙은 에이전트가 푸터를 개편하는 순간 조용히 깨진다. 확인할 버전 번호조차 없다. 라이프사이클 훅이 있으면 이 문제를 피할 수 있고, herdr은 훅 권한이 있는 도구를 우선한다. 다만 Claude Code, Codex, grok은 그 목록에 없어 스크래핑 대상으로 남는다. Claude Code의 훅으로 상태 옵션을 직접 쓸 수도 있지만, 그건 셋 중 하나만 커버한다.
공개된 스크립트는 macOS에서 claude 2.1.x와 grok 1.0.30을 기준으로 검증됐고, codex 패턴은 agenmux에서 가져왔을 뿐 실제 세션 검증은 이뤄지지 않았다. 거친 부분도 두 가지 있다. PID 파일이 /tmp의 고정 경로에 놓여 한 머신에서 tmux 서버 두 개가 같은 파일을 두고 다투게 되고, grok 규칙은 특정 릴리스의 푸터 문자열에 고정돼 있다.