diff --git a/lib/install.js b/lib/install.js index 39c5c44..2bfaa52 100644 --- a/lib/install.js +++ b/lib/install.js @@ -118,19 +118,29 @@ function isCccatHook(entry) { function makeWrapper(prevCommand, cachePath) { const cacheFile = cachePath || path.join(paths.home(), 'prev-status.cache'); + // 캐시 base 경로(…/prev-status). 런타임에 .${sid}.cache 를 붙여 세션(창)별로 분리한다. + const cacheBase = cacheFile.replace(/\.cache$/, ''); // 기존 statusline은 5초 캐시로 실행 빈도를 낮춘다. // (refreshInterval:1 때문에 매초 재실행되면 git status 등 무거운 기존 스크립트가 // 상시 CPU를 소모하므로, 기존 줄은 최대 5초 지연을 허용하고 캐시한다) + // 캐시는 session_id 로 분리한다 — 단일 전역 캐시는 여러 Claude Code 창이 공유하므로 + // 한 창이 캐시를 쓰면 다른 창이 최대 5초간 남의 폴더/상태를 표시하는 오염이 발생한다. + // session_id 는 파이프로 들어온 JSON에서 추출한다(jq 미설치 환경 대비 sed 사용). const prevBlock = prevCommand - ? `# 기존 statusline (설치 전 설정 그대로, 5초 캐시) + ? `# 기존 statusline (설치 전 설정 그대로, 세션별 5초 캐시) ${MTIME_FN} -cache="${cacheFile.replace(/"/g, '\\"')}" +_cache_base="${cacheBase.replace(/"/g, '\\"')}" +sid=$(sed -n 's/.*"session_id"[[:space:]]*:[[:space:]]*"\\([^"]*\\)".*/\\1/p' "$tmp" 2>/dev/null | head -n1) +[ -n "$sid" ] || sid=default +cache="$_cache_base.$sid.cache" fresh="" if [ -f "$cache" ]; then age=$(( $(date +%s) - $(_mtime "$cache") )) [ "$age" -lt 5 ] && fresh=1 fi if [ -z "$fresh" ]; then + # 오래된 세션 캐시 정리(1일 이상). 갱신 시점에만 실행돼 오버헤드 최소. + find "$(dirname "$_cache_base")" -maxdepth 1 -name "$(basename "$_cache_base").*.cache" -mtime +1 -delete 2>/dev/null ${prevCommand} < "$tmp" > "$cache.new" 2>/dev/null && mv -f "$cache.new" "$cache" || : > "$cache" fi [ -s "$cache" ] && cat "$cache"