Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions lib/install.js
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Loading