# 들어가며
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 툴에 커스텀 로직을 추가할 때 이 패턴을 활용해보세요.
다음 글에서는 봇 페르소나별 프롬프트 엔지니어링 기법을 다룰 예정입니다.