Skip to content

명령 ​

zeropty CLI 의 모든 명령과 옵션이에요. 같은 명령이 소켓과 임베딩 API 에서도 그대로 돼요.

CLI 빠르게 보기 ​

sh
zeropty new-session -d -s work -x 220 -y 80 -c ~/proj "$PWD/dist/claude-zeropty"   # 서버가 없으면 띄워요
zeropty capture-pane -p -e -S -200 -t '=work:'    # 화면 + 스크롤백 200줄, 색 포함
zeropty wait-pane -t '=work:' -m '>' -q 1000 -T 60000   # '>'가 보이고 1초 조용할 때까지 (최대 60초)
zeropty send-keys -t '=work:' -l 'hello' && zeropty send-keys -t '=work:' Enter
zeropty attach -t work                            # 사람이 붙어서 보기. Ctrl-b d로 떼기
zeropty attach -r -t work                         # 읽기 전용 (q 또는 Ctrl-c로 떼기)
zeropty kill-session -t '=work:'

도움말과 버전. zeropty --help(또는 -h, help)는 명령과 옵션 목록을, zeropty help <명령>은 그 명령의 사용법과 하는 일, 이 문서의 해당 절 링크를 표준 출력에 내고 종료 코드 0으로 끝나요. 줄임말(help send)도 돼요. 프로그램이 직접 답해서 서버가 없어도 되고, 서버를 띄우지도 않아요. zsh 함수와 bash builtin에서도 같아요. zeropty -V(또는 --version)는 CLI 자신의 버전을 출력해요(실행 중인 서버의 버전은 zeropty display -p '#{version}'). 무엇이 호환 범위인지는 버전 정책, 바뀐 내용은 Changelog에 있어요. 옵션별 설명은 아래 명령 레퍼런스에 있어요.

sh
zeropty --help     # 명령 목록 (종료 코드 0)
zeropty help send-keys   # 명령 하나: 사용법, 하는 일, 문서 링크 (없는 명령이면 종료 코드 2)
zeropty -V         # zeropty X.Y.Z (--version도 같아요)
zeropty            # usage: zeropty serve | <tmux command> ...  (표준 에러, 종료 코드 2)

명령 레퍼런스 ​

괄호 안은 tmux와 같은 줄임말이에요. 옵션 뒤의 <값>은 값을 받는 옵션이에요.

세션 ​

명령옵션하는 일
new-session (new) [명령]-d -s <이름> -x <열> -y <행> -c <폴더> -e <변수=값> -A -P -F <포맷>세션을 만들어요. 명령이 없으면 $SHELL(없으면 /bin/sh)이에요. 크기 기본값은 80×24이고, 이름이 없으면 지금까지 만든 세션 수(0, 1, ...)를 써요. -A는 같은 이름이 있으면 그대로 두고 성공해요. -P는 새 세션 정보를 출력해요(-F로 형식 지정, 기본 이름:). -e는 여러 번 쓸 수 있어요. -n -E -D -X는 창·클라이언트용이라 받아만 둬요
has-session (has)-t세션이 있으면 0, 없으면 1 (can't find session: 이름)
kill-session-t -a세션의 프로세스 그룹에 SIGHUP을 보내고, 2초 뒤에도 남은 프로세스는 SIGKILL해요. -a는 -t 세션을 뺀 나머지 전부예요. -C는 받아만 둬요
list-sessions (ls)-F <포맷>세션 목록. 기본 출력은 tmux와 같은 이름: 1 windows (created ...)예요
rename-session (rename) <새 이름>-t이름을 바꿔요. 빈 이름, :·.이 든 이름, 이미 있는 이름은 오류예요
resize-window (resizew), resize-pane (resizep)-t -x <열> -y <행>화면 크기를 바꿔요. 프로그램은 SIGWINCH를 받아요
pipe-pane (pipep) [명령]-t -o -O세션 출력을 명령의 입력으로 계속 보내요(tmux의 -O가 기본). 명령 없이 부르면 닫혀요. -o는 이미 열려 있으면 닫기만 해요. 명령이 못 받는 출력은 8MB까지 기다리고 넘치면 버려요. 세션을 다른 프로세스로 옮기면 닫혀요
kill-server모든 세션에 SIGHUP을 보내요. 독립 서버는 프로세스도 끝나요. 임베디드 엔진은 세션만 끝나고 계속 돌아요

프로그램이 끝나면 세션도 끝나요(tmux의 remain-on-exit 꺼짐과 같아요).

서버는 자신을 띄운 프로세스(서버를 띄우는 첫 명령: new-session, pull-sessions, zeropty serve)의 환경을 그대로 가져요(tmux와 같아요). 세션은 new-session을 실행한 셸의 환경이 아니라 그 환경에 set-environment -g와 -e를 적용한 것을 받아요. restart-server는 그 명령을 실행한 셸에서 새 서버를 띄워서, 이후 세션은 그 셸의 환경을 받고 set-environment -g로 넣은 값은 사라져요(다시 넣어야 해요). 실행 중인 세션은 자기 환경을 그대로 가져요. 세션 안의 프로그램이 받는 환경: TERM=xterm-256color, COLUMNS/LINES, ZEROPTY_SESSION(세션 이름), ZEROPTY_COLS/ZEROPTY_ROWS, ZEROPTY_SIZE_FILE(shim이 읽는 창 크기 파일), ZEROPTY_TTY_ID(어느 파일이 세션의 터미널인지, shim용). TMUX, TMUX_PANE은 지워요(tmux 안에서 서버를 띄웠어도 세션은 tmux 안이 아니에요).

키 보내기 ​

명령옵션하는 일
send-keys (send) <키>...-t -l -H -N <횟수>키를 보내요. 인자마다 키 이름이면 그 키의 바이트를, 아니면 글자 그대로를 보내요. -l은 키 이름을 해석하지 않고 글자 그대로 보내요. -H는 인자를 16진수 바이트로 읽어요(-H 41 42 0a는 AB + 줄바꿈). -N은 전체를 그 횟수만큼 반복해요
paste-buffer (pasteb)-t -b <버퍼> -d -p -r -s <구분자>버퍼 내용을 키처럼 보내요. 줄바꿈은 \r로 바꿔 보내요(-r이면 그대로, -s로 구분자 지정). -p는 프로그램이 bracketed paste를 켰으면 감싸서 보내요. -d는 보낸 뒤 버퍼를 지워요

키는 PTY처럼 라인 디시플린을 거쳐요.

화면 읽기 ​

명령옵션하는 일
capture-pane (capturep)-t -p -e -J -N -S <줄> -E <줄> -b <버퍼> -q화면을 텍스트로 읽어요. 읽기 직전에 밀린 출력부터 처리해서 늘 최신 화면이에요. -e는 색·글꼴 이스케이프 포함, -J는 줄바꿈으로 나뉜 줄을 이어 붙이고, -N은 줄 끝 공백을 남겨요. -S/-E는 tmux와 같은 줄 번호예요(0이 화면 첫 줄, 음수가 스크롤백, -는 끝까지). -p가 없으면 tmux처럼 화면을 버퍼(-b, 없으면 buffer0)에 넣고 아무것도 출력하지 않아요
display-message (display) [포맷]-t -p -F <포맷>포맷 변수를 채워서 출력해요. 예: display-message -p -t '=work:' '#{cursor_x},#{cursor_y}'

기다리기와 찾기 ​

tmux에는 없는 zeropty 명령이에요. 에이전트가 끝났는지, 어느 세션이 입력을 기다리는지를 폴링 없이 알아요.

명령옵션하는 일
wait-pane-t -m <글자> -q <ms> -T <ms>-m은 그 글자가 화면에 나타날 때까지(이미 있으면 바로), -q는 세션이 그 시간 동안 아무것도 출력하지 않을 때까지 기다려요. 둘 다 주면 둘 다 만족할 때 답해요. -T가 지나면 종료 코드 1(wait-pane: timed out), 기다리는 중에 세션이 끝나도 1(wait-pane: session ended)이에요
grep-panes <글자>-S <줄>모든 세션의 화면에서 글자를 찾아 세션: 줄로 보여요. -S는 capture-pane -S처럼 스크롤백까지 찾아요(-S -100). 세션 이름순이고, 없으면 종료 코드 1이에요(grep처럼)
  • wait-pane은 서버가 출력이 올 때만, 그 출력이 바꾼 행만 확인해요. 글자는 행 단위로 찾아요(줄바꿈으로 나뉜 글자는 못 찾아요).
  • 같은 연결의 다음 명령은 wait-pane의 답 뒤에 처리돼요. client/zeropty.mjs는 wait-pane마다 연결을 따로 열어서 다른 명령이 막히지 않아요.
  • 세션이 마지막 출력을 내자마자 끝나면, 엔진이 그 출력을 확인하기 전에 세션 종료를 먼저 알려 wait-pane: session ended(종료 코드 1)로 끝날 수 있어요(알려진 문제). 기다리는 글자가 나온 뒤에도 세션이 살아 있게 하세요. 예: sh -c 'make; echo build done; exec cat'
  • 임베디드 엔진의 함수 호출로는 wait-pane을 쓸 수 없어요(답을 미룰 루프가 없어서). 서버 플러그인을 켜면 소켓으로는 돼요. Rust 호스트는 Engine::wait_start·wait_check를 직접 써요(examples/polled.rs).

버퍼 ​

명령옵션하는 일
load-buffer (loadb) <파일>-b <버퍼>파일 내용을 버퍼에 넣어요(기본 buffer0). 상대 경로는 명령을 보낸 쪽의 현재 폴더 기준이에요
paste-buffer키 보내기를 보세요
capture-pane -b-p 없이 쓰면 화면을 버퍼에 넣어요

보기 (attach) ​

명령옵션하는 일
attach-session (attach, a)-t -r지금 터미널로 세션에 붙어요. Ctrl-b d로 떼요. -r은 읽기 전용이고 q나 Ctrl-c로 떼요. -t가 없으면 세션이 하나일 때 그 세션에, 여럿이면 번호를 물어봐요

붙어 있는 동안 세션은 내 터미널 크기를 따르고, 떼면 원래 크기로 돌아와요. 여러 터미널이 한 세션에 붙을 수 있고, 크기는 마지막에 붙은 터미널을 따라요.

환경 ​

명령옵션하는 일
set-environment (setenv) <변수> [값]-g -u이후에 만드는 세션에 줄 환경변수를 정해요. -u는 지워요. -g 없이는 tmux에서도 새 창에만 적용되는데, 세션에 새 창이 생기지 않으니 아무 일도 하지 않아요
show-environment (showenv)-g-g로 정한 변수를 보여요. 지운 변수는 -변수로 보여요

서버와 세션 옮기기 ​

명령옵션하는 일
serve--bind <소켓>독립 서버를 직접 띄워요(보통은 new-session이 알아서 띄워요)
pull-sessions [이름...]-s <소켓>다른 서버의 세션을 이 서버로 가져와요(이름 없으면 전부)
push-sessions [이름...]-s <소켓>이 서버의 세션을 다른 서버로 보내요
restart-server새 서버가 세션을 전부 넘겨받고 소켓 자리를 차지해요. 업그레이드에 써요

자세한 동작: 세션 옮기기. 서버끼리 쓰는 내부 요청 export-sessions, import-sessions: 소켓 프로토콜

플러그인 ​

명령옵션하는 일
list-plugins붙은 플러그인마다 한 줄: 이름: 상태 (api N) events=... commands=... access=... dropped=N. 상태는 running, stopped, failed (이유)예요
plugin-attach소켓 연결을 플러그인으로 바꿔요. 소켓에서만 의미가 있어요
plugin-run <라이브러리.dylib>C 플러그인 라이브러리를 별도 프로세스로 불러와 서버에 붙여요. 서버가 끝나면 같이 끝나요

플러그인이 더한 명령은 내장 명령처럼 CLI·소켓·임베디드에서 불러요. ZEROPTY_PLUGIN_DIR를 지정하면 zeropty serve가 그 디렉터리의 플러그인을 띄우고 끝나면 다시 띄워요. 지정하지 않으면(기본) 아무것도 실행하지 않아요. 디렉터리 지정이 그 안의 코드를 서버와 같은 사용자로 실행해도 된다는 동의라서 기본은 꺼 뒀어요(이 기능 전과 같은 동작). 붙이는 법과 프로토콜: 플러그인 API

진단 ​

명령하는 일
stats엔진 카운터 한 줄: sessions, heap_bytes(할당기에 요청한 바이트), screen_bytes, live/frozen 화면 수, 읽기 횟수 등
mstats할당기(mimalloc) 통계. 독립 서버에만 있어요(그 프로세스의 할당기를 세는 명령이라서요)
mem -t <세션>화면 하나의 메모리 내역. 얼린 화면이면 frozen <바이트> B deep <true/false>

MIT 또는 Apache-2.0 라이선스로 배포해요.