From 33926080a2937928e76dccd8043b412bdf59b2b9 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Mon, 29 Sep 2025 17:38:07 +0900 Subject: [PATCH] Update Multi-AI CLI integration doc with verified implementation - Add implementation completed section (2025-09-29) - Document non-TTY pipe mode solution - Include verified CLI flags for Claude/Gemini/OpenAI - Add environment variables for forcing non-interactive mode - Replace pexpect with subprocess.exec approach --- ...29_happybell80_multi_ai_cli_integration.md | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/ideas/250929_happybell80_multi_ai_cli_integration.md b/ideas/250929_happybell80_multi_ai_cli_integration.md index a76acb2..8c4339c 100644 --- a/ideas/250929_happybell80_multi_ai_cli_integration.md +++ b/ideas/250929_happybell80_multi_ai_cli_integration.md @@ -17,6 +17,28 @@ status: idea - **51123 서버**: Claude만 설치 - **51124 서버**: Claude, Gemini, OpenAI 모두 설치, 세션 파일 접근 가능 +## 구현 완료 (2025-09-29) + +### 핵심 해결책: 비-TTY 파이프 모드 +- **문제**: pexpect가 PTY 생성 → TUI 감지 → 대화형 모드 실행 +- **해결**: subprocess.exec + 파이프 + 환경변수로 TUI 회피 +- **검증**: 모든 CLI에서 non-interactive 모드 작동 확인 + +### CLI별 구현 방법 +- **Claude**: `claude -p "prompt" --output-format json` → JSON에서 'result' 필드 추출 +- **Gemini**: `gemini -p "prompt"` → stdout 라인별 스트리밍 +- **OpenAI**: `openai chat.completions.create --stream` → SSE 형식 파싱 + +### 환경변수 설정 +```python +env = { + 'CI': '1', # CI 환경 표시 + 'TERM': 'dumb', # 터미널 기능 없음 + 'NO_COLOR': '1', # ANSI 컬러 비활성화 + 'CLICOLOR': '0' # 추가 컬러 비활성화 +} +``` + ## 목표 여러 AI의 의견을 동시에 얻어 더 나은 의사결정을 내리고 개발 생산성 향상 @@ -106,7 +128,7 @@ tmux attach -t ai-panel ### Phase 0: 단일 CLI 프로토타입 - **대상**: Claude CLI만으로 시작 -- **기술**: pexpect (pty 대신) - PTY 제어, 타임아웃, 패턴 매칭에 강점 +- **기술**: subprocess.exec (파이프 모드) - PTY 회피로 TUI 방지 - **검증 시나리오**: - 정상 스트리밍 응답 - 세션 만료 처리 @@ -126,10 +148,10 @@ tmux attach -t ai-panel - **인터페이스**: healthcheck() | ask()->async iterator | cancel() | resume() - **모드**: PTY/STDIO 모드 지원 - **정규화**: ANSI 제거, 프롬프트 재출현, 타임아웃 규칙 내장 -- **pexpect 패턴**: - - Claude: "❯" 프롬프트, timeout=30 - - Gemini: ">" 프롬프트, timeout=25 - - Codex: ">>>" 프롬프트, timeout=20 +- **CLI 플래그** (2025-09-29 검증): + - Claude: `-p "prompt" --output-format json` (result 필드 추출) + - Gemini: `-p "prompt"` (stdout 스트리밍) + - OpenAI: `chat.completions.create --stream` (SSE 파싱) ### 파싱 규칙 - **종료 판단**: 프롬프트 패턴 + 침묵 타임아웃 + 길이 상한 @@ -152,9 +174,9 @@ tmux attach -t ai-panel - ~/.config/codex: 600 (user read/write only) ### 입출력 제어 -- **pexpect 사용**: pty 모듈보다 안정적, 패턴 매칭 우수 +- **파이프 모드 사용**: PTY 생성 회피로 TUI 방지 (2025-09-29 검증) - **비동기 처리**: asyncio.subprocess로 여러 CLI 동시 제어 -- **입력 전송**: expect/send 메소드 활용 +- **환경변수 강제**: CI=1 TERM=dumb NO_COLOR=1 CLICOLOR=0 ### 응답 파싱 - **ANSI 코드 제거**: 색상 코드, 스피너, ASCII 아트 정규식 제거