Skip to content

feat(codex): tmux Codex CLI를 transcript UI로 연결 - #4

Merged
devswha merged 6 commits into
devswha:mainfrom
Yoonwoo-Ha:feat/codex-tmux-transcript
Jul 21, 2026
Merged

feat(codex): tmux Codex CLI를 transcript UI로 연결#4
devswha merged 6 commits into
devswha:mainfrom
Yoonwoo-Ha:feat/codex-tmux-transcript

Conversation

@Yoonwoo-Ha

@Yoonwoo-Ha Yoonwoo-Ha commented Jul 21, 2026

Copy link
Copy Markdown

배경

Gajae App의 External CLI에서 tmux의 Codex TUI를 그대로 표시하면 모바일 화면 크기에 맞춰 PTY가 재조정되면서 화면이 깨지거나, 넓은 터미널 화면을 억지로 축소해 보여 주는 문제가 있습니다.

이 PR은 Codex CLI 프로세스와 로그인·권한·사용량 체계는 그대로 유지하면서, 화면만 Codex의 JSONL 대화를 이용한 transcript UI로 표시합니다. codex app-server나 별도 API 키는 사용하지 않습니다.

주요 변경 사항

1. tmux Codex 세션과 transcript 자동 연결

  • tmux pane의 프로세스 트리를 검사해 네이티브 codex 세션을 식별합니다.
  • codex resume <thread-id>는 실행 인자에서 thread ID를 바로 연결합니다.
  • 새로 실행한 codex는 프로세스 시작 시각과 작업 경로를 Codex 상태 DB의 thread 정보와 대조해 첫 대화가 생성된 뒤 자동 연결합니다.
  • 아직 앱 DB에 반영되지 않은 JSONL은 즉시 동기화한 후 transcript 세션으로 엽니다.

2. 모바일에 맞는 transcript UI

  • 연결된 Codex 세션은 채팅 말풍선이 아닌 문서형 transcript 화면으로 표시합니다.
  • 새 Codex 세션은 첫 지시 전에도 터미널 TUI 대신 transcript 대기 화면과 입력창을 보여 줍니다.
  • 첫 지시로 JSONL이 생성되면 2초 간격 감지로 실제 transcript 화면에 자동 전환합니다.
  • 도구 실행 내역과 상세 정보는 기존 UI 구조를 재사용하되, 외부 Codex transcript에서는 불필요한 말풍선 스타일을 제거했습니다.

3. Codex CLI 입력·승인 전달

  • transcript 입력창의 내용을 tmux Codex 세션에 literal input으로 전달합니다.
  • 1, 2, 3 같은 승인 선택도 같은 경로로 전달할 수 있습니다.
  • Codex TUI의 paste 판정 때문에 Enter가 누락되는 경우를 막기 위해 입력과 Enter 사이에 짧은 안정화 지연을 둡니다.
  • 현재 열린 transcript와 실제 tmux Codex thread가 달라졌으면 입력을 거부하고 다시 열도록 안내합니다.

4. 웹에서 Codex 세션 생성·종료

  • 사이드바에서 이름과 작업 경로를 지정해 새 tmux Codex 세션을 만들 수 있습니다.
  • Codex 세션만 재확인한 뒤 종료하며, Gajae App 서버 자체를 실행 중인 tmux 세션은 종료할 수 없도록 보호합니다.
  • 작업 경로는 realpath 기준 HOME 내부의 실제 디렉터리만 허용합니다.

5. GJC 0.11 호환성 보완

  • GJC 0.11의 terminal-sessions/tmux-* receipt를 읽어, PC에서 실행한 기존 GJC 대화가 웹에서도 같은 transcript로 연결되도록 보완했습니다.
  • /resume으로 연결된 과거 transcript가 프로젝트 세션 페이지네이션 밖에 있어도, LIVE 행에서 세션 메타데이터를 직접 조회해 해당 프로젝트와 이전 대화를 즉시 열 수 있습니다.
  • 첫 메시지 전의 새 GJC tmux 세션도 대기 행을 눌러 본문 transcript 준비 화면으로 열 수 있습니다.
  • 본문 입력창에서 첫 지시를 보내면 같은 tmux 세대에서 생성된 실제 transcript ID를 감지해 자동 전환합니다.

6. CI 보안 감사 복구

  • PR 실행 시 새로 탐지된 transitive dependency 보안 경고를 해결하도록 package-lock.json을 갱신했습니다.
  • body-parser, brace-expansion, js-yaml의 취약 버전이 안전한 버전으로 교체되며, 직접 의존성이나 애플리케이션 API 변경은 없습니다.
  • 갱신 후 npm audit --audit-level=high 결과는 0건입니다.

동작 흐름

tmux에서 codex 실행
  → External CLI에서 Codex 세션 감지
  → 첫 지시 전: transcript 대기 화면
  → 입력을 tmux Codex CLI로 전달
  → Codex JSONL/thread ID 자동 감지 및 동기화
  → 같은 화면에서 transcript로 자동 전환

검증

  • npm ci
  • npm run audit — 0 vulnerabilities
  • npm run typecheck
  • 변경 파일 ESLint 통과
  • 외부 CLI/GJC 연결 단위 테스트 57개 통과
  • LIVE resume 직접 열기 UI 회귀 테스트 7개 통과
  • npm run build:client
  • npm run build:server
  • 릴리스 native core를 사용한 native core 테스트 8개 통과
  • 실제 Tailscale 주소의 별도 서버에서 다음 흐름 확인
    • 웹 API로 tmux Codex 세션 생성
    • transcript 대기 상태 노출
    • /status 입력 전달 및 Codex CLI 실행
    • 웹 API로 세션 종료
    • Gajae App 호스팅 tmux 세션 종료 요청이 403으로 차단됨

전체 테스트 실행 시 최신 main에서도 동일하게 재현되는 기존 환경성 실패가 있습니다.

  • skill scope 관련 2개 테스트 실패
  • Windows worker guard 테스트 18개 취소 (Promise resolution is still pending)

두 항목 모두 변경 전 v1.2.0 원본 작업 트리에서도 같은 결과임을 별도로 확인했습니다.

참고 사항

  • /status 같은 Codex 관리 명령만 실행하면 대화 JSONL이 생성되지 않으므로 대기 화면이 유지됩니다. 실제 첫 지시를 전송하면 transcript가 생성되어 자동 연결됩니다.
  • 현재 구현은 로컬 Linux 환경의 tmux 및 네이티브 Codex CLI를 대상으로 합니다.

@devswha
devswha merged commit 193da9c into devswha:main Jul 21, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants