From e43e80d3d1a540dc478e4a328236714a71880568 Mon Sep 17 00:00:00 2001 From: dkdannyboy <42829734+dkdannyboy@users.noreply.github.com> Date: Mon, 6 Jul 2026 14:42:40 +0900 Subject: [PATCH] =?UTF-8?q?fix(statusline):=20=EC=84=B8=EC=85=98=EB=B3=84?= =?UTF-8?q?=20=EC=BA=90=EC=8B=9C=EB=A1=9C=20=EC=97=AC=EB=9F=AC=20=EC=B0=BD?= =?UTF-8?q?=20=EA=B0=84=20=ED=8F=B4=EB=8D=94=EB=AA=85=20=EC=98=A4=EC=97=BC?= =?UTF-8?q?=20=EC=B0=A8=EB=8B=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 단일 전역 prev-status.cache 를 여러 Claude Code 창이 공유해, 한 창이 캐시를 쓰면 다른 창이 최대 5초간 남의 폴더·git 상태를 표시하는 오염이 있었다. 캐시 경로를 session_id 로 분리한다. session_id 는 jq 미설치 환경 대비 sed 로 파이프 JSON에서 추출하고, 1일 이상 지난 세션 캐시는 갱신 시점에 자동 정리한다. 🗿 MoAI --- lib/install.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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"