2.9 KiB
2.9 KiB
LazyEnter
소파에서 엔터나 치자.
로컬 PC의 Claude/Codex CLI 세션을 Slack Socket Mode로 중계해 모바일에서도 원격으로 입력/승인을 처리하는 브릿지입니다.
동작 방식
- 로컬에서 Claude 또는 Codex를 tmux 세션으로 미리 실행
- Claude:
tmux new -s claude claude - Codex:
tmux new -s codex codex
- Claude:
- Slack에서
/start claude또는/start codex실행 - 브릿지가 기존 tmux 세션에 attach
- Slack 채널 메시지가 CLI 입력으로 전달됨 (기본: 엔터 미포함)
- CLI 출력이 Slack으로 다시 전송됨
/stop claude또는/stop codex로 브릿지 연결 해제 (tmux 세션은 유지)
빠른 시작
git clone <repo-url>
cd LazyEnter
python -m venv .venv
source .venv/bin/activate
pip install -e .
.env 파일을 생성하고 값을 채우세요:
cp .env.example .env
필수 환경 변수:
SLACK_BOT_TOKENSLACK_APP_TOKENSLACK_ALLOWED_USER_IDSLACK_ALLOWED_CHANNEL_ID
선택 환경 변수:
TMUX_SESSION_NAME(기본:claude,/start claude대상)CODEX_TMUX_SESSION_NAME(기본:codex,/start codex대상)PTY_READ_TIMEOUT(기본:5)OUTPUT_BUFFER_INTERVAL(기본:2.0)OUTPUT_SETTLE_SECONDS(기본:4.0, 출력이 잠잠해진 뒤 전송 대기 시간)OUTPUT_FLUSH_INTERVAL_SECONDS(기본:15.0, 출력이 계속 이어질 때 강제 전송 주기)MAX_MESSAGE_LENGTH(기본:3000)RECONNECT_DELAY_SECONDS(기본:5.0, Socket Mode 재연결 대기 시간)OUTPUT_IDLE_REPORT_SECONDS(기본:120, 출력 정지 보고 임계값)INPUT_IDLE_REPORT_SECONDS(기본:300, 입력 정지 보고 임계값)
SLACK_ALLOWED_USER_ID, SLACK_ALLOWED_CHANNEL_ID가 비어 있으면 실행이 중단됩니다.
Slack 앱 설정
- Socket Mode 활성화
- Bot Token Scopes에
chat:write,commands추가 - Slash Commands 생성:
/start/stop
- 앱을 워크스페이스에 설치 후 토큰을
.env에 반영
실행
먼저 로컬에서 원하는 tmux 세션을 실행:
tmux new -s claude claude
# 또는
tmux new -s codex codex
그 다음 브릿지 실행:
lazy-enter
# 또는
python -m lazy_enter
실행 후 Slack의 허용된 채널에서:
/start claude,/start codex: 기존 세션에 연결- 일반 메시지 전송: 현재 연결된 CLI(Claude/Codex)로 입력만 전달 (엔터 미포함)
!e,!enter전송: 엔터 키만 전달 (현재 프롬프트 제출)/stop claude,/stop codex: 브릿지 연결 해제 (세션 유지)
테스트 및 품질 점검
pytest
ruff check src/ tests/
ruff format src/ tests/
mypy src/
hooks 알림 사용 (선택)
hooks.py는 JSON 이벤트를 받아 Slack 알림 문구로 변환합니다.
echo '{"type":"prompt","tool":"Bash"}' | python -m lazy_enter.hooks
SLACK_ALLOWED_CHANNEL_ID가 설정된 경우 해당 채널로 알림을 보냅니다.