tmux 상태 바를 2줄로 구성하는 설정입니다.
- 위쪽 줄: 왼쪽에는 session 목록, 오른쪽 끝에는 현재 pane과 연결된 Codex 세션의 토큰/API 환산 추정 비용/사용 한도.
- 위쪽 줄의 session 이름: 왼쪽 클릭은 session 전환, 오른쪽 클릭은 session 메뉴.
- 아래쪽 줄: window 목록. 오른쪽 클릭 메뉴에서 현재 window를 다른 session으로 이동 가능.
@codex_donewindow 하이라이트와after-select-window초기화 훅 포함.
- tmux 3.4에서 검증했습니다.
jq가 필요합니다.- foreground Codex 프로세스와 세션을 안전하게 연결하려면 Python 3가 필요합니다.
~/.tmux.conf를 자동으로 수정하려면 Bash가 필요합니다.
tmux/two-line-status.tmux: 실제 tmux 설정 조각.bin/codex-session-usage: Codex 세션 로그를 읽는 statusline helper.bin/tmux-window-session-menu: 이동 가능한 현재 session 목록을 만드는 popup helper.install.sh: 설정 조각을~/.tmux.conf에 설치하는 스크립트.
다른 PC에 설치할 때는 먼저 이 프로젝트 폴더를 해당 PC로 복사합니다. 예를 들어 현재 PC에서:
scp -r /path/to/tmux-statusline user@other-pc:~/tmux-statusline그런 다음 대상 PC에서 tmux, jq, python3를 설치하고 설치 스크립트를 실행합니다.
ssh user@other-pc
cd ~/tmux-statusline
./install.sh --dry-run
./install.sh저장소 URL이 있다면 scp 대신 대상 PC에서 git clone <repository-url>을 사용해도 됩니다. Codex 사용량 연결은 Linux의 /proc와 Codex state DB를 사용하므로 현재 구현은 Linux 대상입니다.
먼저 변경 결과만 검증하려면 dry-run을 실행합니다.
./install.sh --dry-run실제 설치는 아래처럼 실행합니다.
./install.sh설치 스크립트는 대상 파일의 기존 내용을 보존하고, 아래 관리 블록만 추가하거나 교체합니다. 두 helper는 ~/.local/bin/codex-session-usage와 ~/.local/bin/tmux-window-session-menu에 설치합니다.
# >>> tmux-statusline two-line status >>>
# ...
# <<< tmux-statusline two-line status <<<기존 ~/.tmux.conf가 있으면 설치 전에 ~/.tmux.conf.bak.YYYYmmdd-HHMMSS.XXXXXX 형식의 고유 이름으로 백업합니다. 실행 중인 tmux 서버가 있으면 설치 후 tmux source-file로 다시 읽습니다.
다른 파일에 설치하려면:
./install.sh --tmux-conf /path/to/tmux.conf설치만 하고 자동 reload를 건너뛰려면:
./install.sh --no-reloadCodex 세션이 있는 pane에서는 위쪽 줄 오른쪽 끝에 다음과 같이 표시됩니다.
Codex ~$24.80 · 6.1M(88%) · 620k · 5h 22% · 7d 9%
~$24.80: 현재 root thread와 연결된 모든 subagent descendant의 토큰 증가분을 당시 활성 모델에 귀속해, 모델별 표준 API 단가로 합산한 추정액.6.1M(88%): root와 descendant의 input 토큰 합계와 그중 cached input 토큰 비율 (cached input / input × 100).620k: root와 descendant의 output 토큰 합계.5h 22%,7d 9%: Codex가 보고한 각 사용 한도 구간의 사용률.
비용은 각 thread에서 모델별로 (비캐시 입력 × 입력 단가 + 캐시 입력 × 캐시 입력 단가 + 출력 × 출력 단가) / 1,000,000을 계산한 뒤 root와 모든 descendant를 합산합니다. 세션 관계는 호환 가능한 Codex state DB의 thread_spawn_edges를 우선 사용하고, DB edge에 없는 subagent thread는 rollout의 top-level parent_thread_id metadata로 보완합니다. DB를 사용할 수 없을 때만 sessions와 archived_sessions 전체 metadata를 fallback으로 스캔합니다. child ID는 visited 집합으로 중복 제거하고, ancestor·sibling·관계없는 thread는 포함하지 않습니다.
토큰 수는 각 thread의 누적 스냅샷을 독립적으로 계산한 뒤 합산합니다. 한 thread에서 알려진 여러 모델로 전환해도 각 모델의 단가가 정확히 적용됩니다. 현재 내장된 gpt-5.6/gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna, gpt-5.5, gpt-5.5-pro, gpt-5.4, gpt-5.4-mini, gpt-5.4-nano, gpt-5.4-pro, chat-latest, gpt-5.3-codex, o3-deep-research, o4-mini-deep-research, computer-use-preview, o4-mini-2025-04-16 단가는 OpenAI API 가격표의 기본 Standard 요금 기준입니다. 컨텍스트 구간이 있는 모델은 short-context 단가를 사용하고, gpt-5.6은 gpt-5.6-sol 별칭으로 취급합니다. 공식 cached-input 할인이 없는 모델은 cached token도 일반 입력 단가로 계산합니다. Realtime·이미지·음성·영상처럼 modality 또는 시간 단위 과금이 섞인 모델은 rollout의 합산 token만으로 정확히 계산할 수 없어 등록하지 않습니다. 공개 단가가 없는 codex-auto-review는 비공식 잠정 단가 (입력 $2.50 / 캐시 입력 $0.25 / 출력 $15.00) / 1,000,000으로 별도 계산하고, 정식 단가 합계와 섞지 않은 ~$4.03(+$3.21) 형태로 표시합니다. 괄호 안 +$3.21만 미확인 추정분입니다. 그 밖의 미등록 모델, 손상된 usage, 비정상 누적 카운터, 누락 descendant 또는 관계 충돌은 해당 부분을 비용에서 제외하고 나머지를 계속 합산하되 Codex !!$4.03처럼 ~ 대신 !! 경고 마커를 표시합니다. rate limit은 thread별로 합산하지 않고 root가 보고한 계정 단위 값을 표시합니다.
이 금액은 API를 사용했다고 가정한 환산 추정치이며 ChatGPT/Codex 구독의 실제 청구 금액이나 크레딧 사용량이 아닙니다. 요청별 장문 컨텍스트 할증, cache-write 토큰, Batch/Flex/Priority 같은 service tier 차이는 누적 로그만으로 정확히 재구성할 수 없어 반영하지 않습니다. Codex 구독 사용량은 별도의 Codex 가격 및 크레딧 안내를 따릅니다.
Linux에서는 먼저 pane 아래쪽에 보이는 Codex 자체 statusline의 마지막 thread-id 항목이나 codex resume 안내의 thread ID를 읽고, 실제 rollout 파일이 있는 ID만 채택합니다. 화면의 일반 출력에 들어 있는 임의의 UUID는 세션 ID로 취급하지 않습니다. 화면에서 ID를 찾지 못하면 pane TTY의 foreground Codex executable에서 CODEX_THREAD_ID를 찾고, 최신 Codex처럼 이 변수를 내보내지 않으면 프로세스 시작 시각과 정확히 같은 cwd로 Codex state DB를 조회합니다. Codex가 TTY 없는 app-server로 실행되는 경우에는 pane cwd와 정확히 일치하는 최근 30분 이내의 최상위 thread 가운데 최신 후보가 다른 후보보다 30초 이상 새로울 때만 채택합니다. 따라서 ID를 찾지 못했거나 /new, resume, fork 또는 동시 실행 때문에 현재 thread를 확정할 수 없거나 해당 세션 로그가 없으면 아무것도 표시하지 않습니다. 배경 프로세스나 일반 shell이 같은 변수를 상속했더라도 사용하지 않습니다.
터미널 폭이 80열보다 좁으면 왼쪽 session 이름을 위한 공간을 확보하도록 사용 한도 구간은 생략하고 Codex ~$24.80 · 6.1M(88%) · 620k 형태로 표시합니다.
helper만 직접 확인하려면:
~/.local/bin/codex-session-usage --session "$CODEX_THREAD_ID"자동 설치를 쓰지 않으려면 ~/.tmux.conf에서 기존 상태 바 관련 설정을 정리한 뒤 아래 한 줄을 추가할 수 있습니다.
먼저 helper를 설치합니다.
install -Dm755 bin/codex-session-usage ~/.local/bin/codex-session-usage
install -Dm755 bin/tmux-window-session-menu ~/.local/bin/tmux-window-session-menu그 다음 설정을 불러옵니다.
source-file /path/to/tmux-statusline/tmux/two-line-status.tmux그 다음 실행 중인 tmux에서:
tmux source-file ~/.tmux.conf가장 확실한 복원 방법은 설치 스크립트가 만든 백업을 되돌린 뒤 tmux 서버를 새로 시작하는 것입니다.
cp ~/.tmux.conf.bak.YYYYmmdd-HHMMSS.XXXXXX ~/.tmux.confsource-file은 파일에서 사라진 전역 option, hook, key binding을 자동으로 초기화하지 않습니다. 따라서 실행 중인 tmux session을 모두 정상 종료해 서버가 끝난 뒤 tmux를 다시 시작해야 완전히 복원됩니다. 즉시 재시작하려면 작업을 저장하고 모든 session을 종료해도 되는지 확인한 뒤에만 tmux kill-server를 사용하세요.
백업 대신 이 설정만 제거하려면 ~/.tmux.conf에서 아래 두 마커 사이의 블록을 삭제하고, 마찬가지로 기존 tmux server가 끝난 뒤 tmux를 다시 시작합니다.
# >>> tmux-statusline two-line status >>>
# <<< tmux-statusline two-line status <<<session 줄은 #[range=session|...] 범위를 사용합니다. 그래서 status 영역에서 오른쪽 클릭했을 때 #{mouse_status_range}가 session이면 session 메뉴를 열고, 그 외에는 window 메뉴를 열도록 분기합니다. session 메뉴에서는 session 전환·이름 변경·새 window·새 session 생성·삭제를 할 수 있습니다. 이 분기 때문에 위쪽 줄의 session 이름 위에서 window 메뉴가 뜨는 문제가 재발하지 않습니다. Codex 사용량이나 빈 공간을 오른쪽 클릭하면 기존 window 메뉴가 열립니다.
window 메뉴의 Move to Session을 선택하면 현재 session 목록이 처음 우클릭한 마우스 위치에 팝업 메뉴로 열립니다. 현재 session은 비활성 상태로 표시되고, 다른 session을 마우스로 클릭하거나 숫자 키로 선택하면 우클릭한 window가 그 session의 다음 빈 index로 이동합니다. 팝업은 마우스를 움직이거나 최초 우클릭 버튼을 놓아도 유지되며, Esc를 누르거나 팝업 바깥 또는 항목을 명시적으로 클릭할 때 닫힙니다. session이 하나뿐이면 메뉴 항목이 비활성화됩니다.