본문으로 바로가기
ai-automation2026년 4월 19일·조회 31

CLI 툴에 봇 페르소나 시스템 구현하기 - PowerShell Hook 활용법

세션별 상태 관리로 여러 AI 어시스턴트를 동시에 사용하는 방법

SP

SpacePlanning

SpacePlanning AI Team

# 들어가며 CLI 기반 AI 툴을 사용할 때 특정 역할이나 성격을 가진 '봇 페르소나'를 지정하면 작업 효율이 크게 향상됩니다. 예를 들어 코드 리뷰는 '제임스'에게, 데이터 분석은 '오라클'에게 맡기는 식으로 역할을 분리할 수 있습니다. 하지만 여러 세션을 번갈아 사용할 때 각 세션의 봇 설정이 섞이는 문제가 발생합니다. 이 글에서는 PowerShell Hook을 활용해 세션별 봇 상태를 독립적으로 관리하는 방법을 소개합니다. ## 기존 방식의 문제점 초기 구현에서는 전역 파일 하나로 봇 상태를 관리했습니다. ```powershell # 기존 방식 $stateFile = "$env:TEMP\claude_bot_session.txt" Set-Content $stateFile "James" ``` 이 방식의 문제: - 세션 A에서 '제임스' 설정 → 세션 B에서 '오라클' 설정 → 세션 A로 돌아오면 '오라클'이 로드됨 - `--resume` 기능 사용 시 원래 세션의 봇이 아닌 마지막으로 설정한 봇이 로드됨 ## 해결 방법: 세션별 상태 파일 분리 ### 1. 세션 ID 기반 파일 구조 ```powershell # 개선된 방식 $sessionId = $env:CLAUDE_SESSION_ID # 환경변수로 전달받음 $sessionDir = "$env:TEMP\claude_bot_sessions" $stateFile = "$sessionDir\$sessionId.txt" if (-not (Test-Path $sessionDir)) { New-Item -ItemType Directory -Path $sessionDir | Out-Null } Set-Content $stateFile "James" ``` 각 세션마다 고유 파일을 생성하므로 상태가 섞이지 않습니다. ### 2. 봇 이름 감지 로직 사용자 입력에서 봇 이름을 추출하는 정규표현식: ```powershell $botNames = @("네오", "제임스", "아테나", "오라클") # 등등 $userMessage = $env:USER_MESSAGE foreach ($bot in $botNames) { if ($userMessage -match "$bot(야|아)|@$bot") { Set-Content $stateFile $bot break } } ``` 한글/영문 호출 방식 모두 지원: - `제임스야 코드 리뷰해줘` - `@James please review this` ### 3. 자동 정리 메커니즘 오래된 세션 파일을 자동 삭제해 디스크 공간을 확보합니다. ```powershell $expiryDays = 7 Get-ChildItem $sessionDir -Filter "*.txt" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$expiryDays) } | Remove-Item -Force ``` ## 실제 사용 시나리오 ### 시나리오 1: 병렬 작업 ```bash # 터미널 1 - 코드 리뷰 전용 $ claude > 제임스야 이 PR 리뷰해줘 [James 봇 활성화] > exit # 터미널 2 - 데이터 분석 전용 $ claude > 오라클아 이 쿼리 최적화해줘 [Oracle 봇 활성화] > exit # 다시 터미널 1로 돌아가기 $ claude --resume [James 봇 자동 로드] # Oracle이 아님! ``` ### 시나리오 2: 역할별 워크플로우 - **스카우트**: 코드베이스 탐색 - **아테나**: 아키텍처 설계 - **포지**: 빌드/배포 자동화 각 역할을 별도 세션으로 유지하면서 작업을 전환할 수 있습니다. ## 구현 시 주의사항 ### 1. 환경변수 전달 방식 CLI 툴이 Hook 스크립트에 세션 정보를 전달하는 방법: ```powershell # 메인 프로그램에서 $env:CLAUDE_SESSION_ID = [GUID]::NewGuid().ToString() & "hook-script.ps1" ``` ### 2. 동시성 문제 여러 프로세스가 동시에 같은 파일을 쓸 수 있으므로 파일 잠금 처리 필요: ```powershell try { $fileStream = [System.IO.File]::Open($stateFile, 'Create', 'Write', 'None') # 쓰기 작업 $fileStream.Close() } catch { Write-Warning "파일 잠금 실패" } ``` ### 3. 크로스 플랫폼 고려 Windows(PowerShell) 외에 Linux/Mac(Bash)도 지원하려면: ```bash #!/bin/bash SESSION_DIR="$TMPDIR/bot_sessions" STATE_FILE="$SESSION_DIR/$CLAUDE_SESSION_ID.txt" mkdir -p "$SESSION_DIR" echo "James" > "$STATE_FILE" ``` ## 확장 아이디어 ### 1. 봇 설정 파일화 JSON으로 봇별 프롬프트 관리: ```json { "James": { "role": "코드 리뷰어", "prompt": "당신은 시니어 개발자입니다...", "temperature": 0.3 } } ``` ### 2. 세션 히스토리 어떤 봇을 언제 사용했는지 로깅: ```powershell Add-Content "$sessionDir\history.log" "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - James" ``` ### 3. 팀 공유 봇 설정을 Git 저장소로 관리해 팀원과 공유할 수 있습니다. # 마치며 세션별 상태 관리는 다음과 같은 이점을 제공합니다: - ✅ 여러 작업을 동시에 진행해도 컨텍스트가 섞이지 않음 - ✅ `--resume` 기능이 정확히 동작 - ✅ 자동 정리로 시스템 리소스 낭비 방지 PowerShell Hook은 간단하지만 강력한 확장 메커니즘입니다. CLI 툴에 커스텀 로직을 추가할 때 이 패턴을 활용해보세요. 다음 글에서는 봇 페르소나별 프롬프트 엔지니어링 기법을 다룰 예정입니다.
#PowerShell#CLI#세션관리#AI봇#Hook시스템#상태관리
공유하기:

이 주제에 대해 더 알아보고 싶으신가요?

프로젝트 상담을 통해 맞춤형 솔루션을 제안받으세요.