·tips

Claude Codeで認証だけ分けてセッションを共有する

CLAUDE_CONFIG_DIRをprofile化し、認証は分けつつsettings.jsonやsessionsはsymlinkで共有する

2 min read
Writing style

まとめ

  • Claude CodeはCLAUDE_CONFIG_DIRで設定ディレクトリを切り替えられる
  • CLAUDE_PROFILEは標準ではないので、シェル関数でCLAUDE_PROFILECLAUDE_CONFIG_DIRに変換する
  • ~/.claude.jsonはOAuth sessionなどを含むので共有しない
  • settings.jsonskillscommandsprojectssessionsあたりをsymlinkすると、認証は分けつつ設定・拡張・履歴はだいたい共有できる

CLAUDE_PROFILEを作る

~/.zshrcなどに追加する:

claude() {
  local dir

  case "${CLAUDE_PROFILE:-default}" in
    default|work) dir="$HOME/.claude" ;;
    personal) dir="$HOME/.claude-personal" ;;
    *)
      echo "unknown CLAUDE_PROFILE: ${CLAUDE_PROFILE}" >&2
      echo "expected: default, work, or personal" >&2
      return 2
      ;;
  esac

  CLAUDE_CONFIG_DIR="$dir" command claude "$@"
}
claude
CLAUDE_PROFILE=personal claude
CLAUDE_PROFILE=personal claude auth login

設定とセッションを共有する

~/.claude-personalを作り、ユーザー設定、skillやcommand、セッション履歴を~/.claudeへsymlinkする。

profile="$HOME/.claude-personal"
shared="$HOME/.claude"

mkdir -p "$profile"

for item in \
  settings.json \
  skills commands \
  projects sessions transcripts todos tasks plans file-history history.jsonl
do
  [ -e "$shared/$item" ] || continue
  [ -e "$profile/$item" ] || [ -L "$profile/$item" ] || ln -s "$shared/$item" "$profile/$item"
done

hooksのようにスクリプト実体を置くディレクトリは、settings.json側で絶対パス参照していればsymlinkしなくても動く。pluginsはprofileごとに実体を持つ。

注意点

  • ~/.claude.jsoncredentialstokenoauthauthっぽいファイルは共有しない
  • --continueやtrust設定など、.claude.json側のstateに寄るものはprofileごとに分かれることがある
  • Claude Code公式の想定はCLAUDE_CONFIG_DIR単位の分離なので、この構成はsymlink運用

ref