레이블이 tmux인 게시물을 표시합니다. 모든 게시물 표시
레이블이 tmux인 게시물을 표시합니다. 모든 게시물 표시

claude code with zellij

최근 버전의 claude code 에서는 AGENT_TEAMS(팀모드)를 제공한다.
~/.claude/settings.json 에 아래 환경변수를 활성화 하면된다.
  "env": {
    "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
  },

이게 기존 병렬 에이전트와 다른 점은 서브 에이전트들끼리 통신할 수 있고, tmux가 설치되어 있다면 각 에이전트들의 작업을 볼수 있어 좋다.

            팀모드 (TeamCreate + Agent)        병렬 에이전트 (Agent only)
실행 방식     별도 프로세스 (out-of-process)        인프로세스 (in-process)
tmux pane   각 teammate마다 별도 pane 생성        생성 안됨
UI 표시      각 pane에서 실시간 진행 확인 가능        메인 화면에서 결과만 반환
통신         SendMessage로 메시지 교환            결과를 직접 반환
작업 관리     TaskCreate/TaskUpdate로 추적        없음 (단발성)
teammate 간 가능 (서로 메시지 송수신)               불가 (독립 실행)
수명         idle 대기, 추가 작업 할당 가능          작업 완료 시 즉시 종료

그런데 multiplexer로는 tmux 만 공식 지원해서 zellij 에서 쓸수 없었는데
https://github.com/stanislc/zellij-claude-teams 에서 zellij 용 shim 을 제공한다.
zellij 환경의 claude code 에서 tmux 명령이 호출되면 shim이 이를 가로채 zellij pane으로 라우팅한다.

zellij 세션에서 claude code 를 실행하고 팀모드로 작업 요청을 하면 다음과 같이 zellij pane 으로 에이전트들의 작업중인 내용을 볼수 있다. 작업이 끝다면 서비스에이전트 pane 들은 자동으로 닫힌다.

[참고]
zellij 버전업이 되면서 동작 방식이 바뀌어 shim 이 동작안한다.
흠, 매번 shim 도 같이 관리가 되어야하는데 비공식으로 개인이 관리하는거라 큰 기대를 할 수 없다.
그냥 안쓰기로 함.

zellij multiplexer

# terminal multiplexer 로 tmux 만 사용하다 rust 로 만든 zellij 로 변경했는데, 역시 기대 이상으로 대만족!
# 더이상 tmux 가 생각나지 않을 정도로 좋다.

# 설치
# mac
brew install zellij
# cargo
cargo install zellij

# 자주 사용하는 단축키
# 기본적으로 아래 화면에 친절하게 단축키 설명이 있어 쉽게 사용할 수 있다.
# ctrl+b : 기본적인 tmux split(ctrl+", ctlr+%)등을 사용할 수 있다.
# ctrl+g : zellij 단축키 입력 비활성화(토글), 예를 들어 ctlr-t 로 fzf 단축키를 사용하고 싶은데 zellij 의 ctrl-t(tab 선택) 명령이 우선 작동하는데, ctrl-g 를 zellij 단축키를 비활성화한후 ctrl-t 를 하면 fzf ctrl-t 커맨드를 실행할 수 있다.
# ctrl-p : pane 선택
# ctrl-p, n : 새 pane 생성 
# ctrl-p, w : floating pane 생성, floating/일반 pane 사이 전환(토글)
# ctrl-p, x : 현재 pane 종료
# ctrl-p, z : pane frame 보이기/감추기(토글)
# ctrl-t, n : 새 tab 생성
# ctrl-t, x : 현재 tab 종료(tab 에 속한 모든 pane 종ㄹ)
# ctrl-t, ctrl-s : tab 에 속한 모든 pane 에 sync 로 동시 입력 가능(토글)
# ctrl-h, 방향키 또는 hjkl(vim방향키) : pane 을 특정 방향으로 이동
# ctrl-n, 방향키 또는 hjkl(vim방향키) : pane 크기를 특정 방향으로 줄이거나 늘이기
# ctrl-n, - : pane 크기를 전체적으로 줄이기
# ctrl-n, + : pane 크기를 전체적으로 늘이기
# alt-p : 적절한 위치와 크기로 pane 생성
# alt-h : 왼쪽 pane 으로 이동(선택), 다른 tab 의 pane 까지 이동 가능
# alt-l : 오른쪽 pane 으로 이동(선택), 다른 tab 의 pane 까지 이동 가능
# alt-k : 위 pane 으로 이동(선택)
# alt-j : 아래 pane 으로 이동(선택)

# 설정 파일
# 기본 설정 파일을 생성해 ~/.config/zellij/config.yaml 로 위치시키면 된다.
# config.yaml 수정으로 단축키 설정을 변경할 수 있다.
mkdir -p ~/.config/zellij/
zellij setup --dump-config > ~/.config/zellij/config.yaml

# 테마 변경
mkdir -p ~/.config/zellij/themes
https://github.com/zellij-org/zellij/tree/main/example/themes 에서 테마 마들을 다운로드 받는다.
~/.config/zellij/config.yaml > theme 필드값을 수정

byobu 로 tmux 를 좀더 이쁘고 쉽게 쓰기

# byobu
# (뵤부?, 일본어로 '병풍'이라는 뜻이다.)
# (만든 사람은 구글아저씨 https://github.com/dustinkirkland/byobu)
# 는 tmux 또는 screen 을 좀더 쉽고 이쁘게 해주는 프로그램이다.
# 맥에서 설치(yum, apt 등에서도 설치 가능)
brew install byobu

# 기본 키바인딩
F2 - Create a new window
F3 - Move to previous window (alt + left)
F4 - Move to next window (alt + right)
F5 - Reload profile
F6 - Detach from this session
F7 - Enter copy/scrollback mode
F8 - Re-title a window
F9 - Configuration Menu
F12 -  Lock this terminal
shift-F2 - Split the screen horizontally
ctrl-F2 - Split the screen vertically
shift-F3 - Shift the focus to the previous split region
shift-F4 - Shift the focus to the next split region
shift-F5 - Join all splits
ctrl-F6 - Remove this split
ctrl-F5 - Reconnect GPG and SSH sockets
shift-F6 - Detach, but do not logout
alt-pgup - Enter scrollback mode
alt-pgdn - Enter scrollback mode
Ctrl-a $ - show detailed status
Ctrl-a R - Reload profile
Ctrl-a ! - Toggle key bindings on and off
Ctrl-a k - Kill the current window
Ctrl-a ~ - Save the current window's scrollback buffer

# 자세한 사용방법은 man page 를 참고하자.
man byobu

htop vtop bpytop 사용

# nix 계열에서 프로세스 모니터링을 위해 기본적으로 사용된 top 프로그램들

# C 로 만든 htop
# http://hisham.hm/htop/index.php
# https://github.com/hishamhm/htop
# 설치
# centos
yum install htop

# ubuntu
apt-get install htop

# mac
brew install htop

# h : help
# t : tree view
# p : program path
# q : quit
# P : sort by CPU
# M : sort by MEM
# T : sort by TIME
# space : tag process



# javascript 로 만든 vtop
# https://parall.ax/vtop
# https://github.com/MrRio/vtop
# 설치 (실행 후 업데이트 버전이 있으면 자동 업데이트)
sudo npm install -g vtop
# 실행시 옵션으로 테마를 적용할 수 있다. ex) vtop --theme monokai


# bpytop
# https://github.com/aristocratos/bpytop
# python 으로 만들어졌고 cpu 온도까지 표시되는 가장 최신 스타일의 top 프로그램이다.
# 설치
pip3 install bpytop --upgrade
brew install hacker1024/hacker1024/coretemp
brew install osx-cpu-temp

# osx-cpu-temp 는 cpu 통 온도 하나만 표시하는데,
# 코어별 온도가 표시되는 coretemp 설치하면 사용하지 않아 설치할 필요 없다.
# 그런데 맥북에서 coretemp 실행하면 0 번째 코어를 찾지 못하는 문제가 있다.
# imac 에선 코어별 SMC 센서 코드가 TCOC, TC1C .. 로 0부터 시작하지만
# macbook 에선 TC1C, TC2C,.. 로 1부터 시작하는 차이가 있다.
# 그리고 CPU 전체 온도를 imac 에선 CPU DIE 로 TC0D 로 사용하지만
# macbook 에선 CPU Proximity 로 TC0P 로 사용한다.
# SMC 코드 참고 https://logi.wiki/index.php/SMC_Sensor_Codes
# 이 때문에 맥북에선 cpu core 별 온도가 표시되지 않는다.
# 해당 coretemp 코드 수정해서 PR 날린 상태다.
# 아래처럼 기존 패키지는 삭제하고 repo 로 빌드하고 복사해 사용하면 온도가 표시된다.
brew uninstall osx-cpu-temp coretemp 
git clone https://github.com/ysoftman/coretemp && cd ./coretemp && make && ./coretemp && cp -v ./coretemp /usr/local/bin

# macbookpro(mbp) coretemp 수정 PR 생성했는데 머지됐다.
# 그냥 coretemp 사용하면 된다.ㅎ

# M : 메뉴설정에서 테마 변경등을 변경할 수 있다.


# tmux 로 4개의 top 을 띄워본 화면
# 0 기본 top
# 1 htop
# 2 vtop
# 3 bpytop


# btm
# 설치
brew install bottom
# rust 로 만들었고, usage 를 그래프로 보고 싶을때 bpytop, vtop 보다 빠르게 로딩돼 좋다.

# ytop
# 설치
brew install ytop
# rust 로 만들었고, btm 처럼 빠르다.

# btop
# 설치
brew install btop
# c++ 로 만들었고 bpytop과 UI가 비슷하다.

linux tmux

Tmux (terminal multiplexer)는 하나의 터미널을 다수의 pane(영역)으로 구분하여 프로그램을 실행하고 각 프로그램 사이를 쉽게 이동할 수 있는 툴이다. 보통을 screen 툴을 사용하거나 gui 환경에선 터미널을 여러개의 탭으 생성하여 사용하는데, 한화면에서 여러개의 프로그램으로 돌리며 모니터링할 수 있는데는 tmux 가 좋다.
공식 홈페이지 http://tmux.sourceforge.net/

# Ubuntu 에서 설치
sudo apt-get install tmux

# CentOS 에서 설치
sudo yum install tmux

# MacOS 에서 설치
brew install tmux

#####

# tmux 명령어/단축키
tmux -V # 버전, 버전에 따라 명령이 조금 달라질 수 있다.
tmux # 실행(새로운 세션으로 터미널 열림)
tmux new-session # 실행(새로운 세션으로 터미널 열림)
tmux list-commands # tmux 명령어 보기
tmux ls # 열려 있는 세션 리스트
tmux kill-server # 모든 세션(tabs,pane)종료
tmux list-windows # tab(window) 리스트
tmux list-panes # pane 리스트
tmux a # 세션 붙이기(attach)

# 수직분할 후 수평분할된 3개의 pane 을 가진 세션 시작
tmux new-session \; \
split-window -v \; \
split-window -h \;
attach

# 기본 prefix(ctrl+b) 대신 ctrl+a 사용하기
#set -g prefix C-a
#bind C-a send-prefix
#unbind C-b

ctrl+b ? # 설정된 단축키 보기
ctrl+b : # 명령 프롬프트 사용
ctrl+b t # 현재 시간 보기
ctrl+b s # session 리스트 보기 및 선택(enter), x 는 세션 삭제
ctrl+b c # 새 window(tab) 생성
ctrl+b w # window(tab) 리스트 보기 및 선택(enter), x 는 윈도우 삭제
ctrl+b n # 다음 tab 이동
ctrl+b p # 이전 tab 이동
ctrl+b f # tab 찾기
ctrl+b 번호  # tab 로 이동
ctrl+b , # 현재 tab 이름 변경
ctrl+b & 또는 exit # 현재 tab 종료
ctrl+b d # 세션 떼기(detach)
ctrl+b % # 수직으로 pane 나누기
ctrl+b " # 수평으로 pane 나누기
ctrl+b ! # 현재 pane 떼서 new tab 으로 이동시키기
ctrl+b q 번호선택 # pane 번호 보기 및 번호로 pane 선택
ctrl+b 방향키 # pane 이동(ctrl+b 후 방향키로 계속 이동 가능)
ctrl+b spacebar # pane 레이아웃 변경
ctrl+b alt+방향키 # pane 크기 변경
ctrl+b x 또는 exit # 현재 pane 종료
ctrl+b m 현재 pane mark/unmark
ctrl+b { 현재 선택한 pane 과 위쪽 pane 위치 교환
ctrl+b } 현재 선택한 pane 과 아래쪽 pane 위치 교환

# copy & paste
# setw -g mode-keys vi 로 vi 단축키를 활성화 선행
ctrl+b [ # copy mode 시작
spacebar # 블럭지정 시작, 방향키로 복사할 블럭 지정
enter # 복사
ctrl+b ] # 붙이기

# find
ctrl+b [ # copy mode 시작
/ # 찾을 문자 입력, vi 찾기와 같음

#####

# tmux 시작시 로딩되는 설정파일
# 명령 프롬프트로에서도 사용
vi ~/.tmux.conf
# -g global option
set -g display-panes-time 5000 # 5초 동안 pane 숫자 보이기

# 마우스 사용 활성화
# tmux 1.9 이전
#set -g mode-mouse on
#set -g mouse-resize-pane on
#set -g mouse-select-pane on
#set -g mouse-select-window on
# tmux 1.9 이후
set -g mouse on

# setw -> set window
setw -g mode-keys vi # vi 단축키 사용(디폴트는 emacs)

#setw synchronize-pane on # 모든 panes 에 동시 입력 활성화
#setw synchronize-pane off # 모든 panes 에 동시 입력 해제

# tab_mode 커스텀 모드 생성
bind -n C-t switch-client -T tab_mode \; refresh-client -S
bind -T tab_mode C-t switch-client -T root

# pane_mode 커스텀 모드 생성
bind -n C-p switch-client -T pane_mode \; refresh-client -S
bind -T pane_mode C-p switch-client -T root

# move_mode 커스텀 모드 생성
bind -n C-h switch-client -T move_mode \; refresh-client -S
bind -T move_mode C-h switch-client -T root

# resize_mode 커스텀 모드 생성
bind -n C-n switch-client -T resize_mode \; refresh-client -S
bind -T resize_mode C-n switch-client -T root

# tab_mode 에서 s 동시 입력 활성/비활성화 토글
bind -T tab_mode s setw synchronize-panes \; display "sync-panes: #{?synchronize-panes,ON,OFF}" \; switch-client -T tab_mode

# pane_mode 에서 s 동시 입력 활성/비활성화 토글
bind -T pane_mode s setw synchronize-panes \; display "sync-panes: #{?synchronize-panes,ON,OFF}" \; switch-client -T pane_mode

# 데모 메뉴 (C-p D): 9분할 생성(s), 데모 명령 실행(d)
# 9분할: 현재 창을 계속 split-window 하면 공간이 없다는 에러 발생하므로
# select-pane 으로 활성 창을 옮겨가며 분할해야 한다.
# 데모 명령 실행은 9분할 후 쉘 프롬프트가 뜨고난 뒤 사용.
bind -T pane_mode D display-menu -T "데모" \
"9분할 tiled" s {
    split-window -v
    split-window -v
    split-window -v
    split-window -v
    select-pane -t 1
    split-window -h
    split-window -h
    split-window -h
    split-window -h
    select-layout tiled
} \
"9분할 tiled 에서 명령 실행" d {
    select-pane -t 1
    send-keys 'echo ysoftman1' Enter
    send-keys 'cmatrix' enter
    select-pane -t 2
    send-keys 'echo ysoftman2; fd . /usr | xargs hexdump -C' enter
    select-pane -t 3
    send-keys 'echo ysoftman3; rg -i if /usr' enter
    select-pane -t 4
    send-keys 'echo ysoftman4; \sl -a; wtfutil' enter
    select-pane -t 5
    send-keys 'echo ysoftman5; cacafire' enter
    select-pane -t 6
    send-keys 'echo ysoftman6; htop' enter
    select-pane -t 7
    send-keys 'echo ysoftman7; infinite_cowsay' enter
    select-pane -t 8
    send-keys 'echo ysoftman8; asciiquarium' enter
    select-pane -t 9
    send-keys 'echo ysoftman9; for ((;;)); do imgcat ${myenv_path}/xelloss.jpg; sleep 1; done' enter
}

# 별도 설정 파일 읽기
# source-file ~/workspace/a/a.conf;
# 별도 설정 파일이 존재하면 읽기
if-shell "test -f ~/workspace/a/a.conf" "source ~/workspace/a/a.conf"

# tmux 다시 읽기
# display-message (alias: display) 상태바에 메시지 출력  -p 사용하면 stdout에 출력
bind r source-file ~/.tmux.conf \; display "ysoftman ~/.tmux.conf loaded"

# 현재 바인딩되 있는 모든 단축키 확인
tmux list-keys

#####

iterm2 에서 tmux의 내용을 마우스 드래그해서 copy and paste 가 안될때는
iterm2 -> preferences -> gerneral -> applications in terminal my access clipboard 활성화 (아래 그림 참고)


#####

# .bashrc, .zshrc 에 설정시
# TMUX 변수 값을 확인해 중복 실행을 막는다.
if [ -z "$TMUX" ]; then exec tmux; fi

Prev