LazyEnter

소파에서 엔터나 치자.
로컬 PC의 Claude/Codex CLI 세션을 Slack Socket Mode로 중계해 모바일에서도 원격으로 입력/승인을 처리하는 브릿지입니다.

동작 방식

  1. 로컬에서 Claude 또는 Codex를 tmux 세션으로 미리 실행
    • Claude: tmux new -s claude claude
    • Codex: tmux new -s codex codex
  2. Slack에서 /start claude 또는 /start codex 실행
  3. 브릿지가 기존 tmux 세션에 attach
  4. Slack 채널 메시지가 CLI 입력으로 전달됨 (기본: 엔터 미포함)
  5. CLI 출력이 Slack으로 다시 전송됨
  6. /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_TOKEN
  • SLACK_APP_TOKEN
  • SLACK_ALLOWED_USER_ID
  • SLACK_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가 설정된 경우 해당 채널로 알림을 보냅니다.

Description
소파에서 엔터나 치자
Readme Apache-2.0 165 KiB
Languages
Python 100%