Claude Media
Claude CodeをReplitにインストールする手順 — 再起動で消えるのはバイナリ

Claude CodeをReplitにインストールする手順 — 再起動で消えるのはバイナリ

Replitでワークスペースを再起動するたびにClaude Codeを入れ直し、ログインもやり直す。消えているのは認証情報ではなく実行ファイルである可能性が高い理由と、npmでの入れ直しと環境変数での回避を示します。

Replitのワークスペースを再起動したらclaude: command not foundと返り、入れ直すとログインも求められる。「認証が毎回消える」と感じる症状ですが、GitHubのissue #20163では、消えているのは認証情報ではなくclaudeの実行ファイルだと報告されています。このissueはopenのままで、Claude Code側の修正は示されていません。

ここでは、実行ファイルと認証情報のどちらが消えているかの見分け方、npmで入れ直す手順、npmに戻したくないときの選択肢を順に示します。

再起動で消えるのは認証ではなく実行ファイル

issueの報告者はReplitのワークスペースを2つの領域に分けて説明しています。/home/runner/workspace/は再起動をまたいで残り、/home/runner/のそれ以外は再起動のたびに消える、という整理です。

公式のセットアップ手順にあるネイティブインストーラ(curl -fsSL https://claude.ai/install.sh | bash)は、macOSとLinuxで次の場所に書き込みます。

場所中身
~/.local/bin/中身claudeの起動用リンク
~/.local/share/claude/中身ダウンロードしたバージョンごとの実体
~/.local/state/claude/中身ロックファイル
~/.cache/claude/中身取得途中のファイル
~/.claude.json中身グローバル設定。インストール方法もここに記録

Replitでは~/.localが/home/runner/.localにあたるため、報告者の環境では再起動のたびに実体とリンクが消えました。一方、~/.claudeは/home/runner/workspace/.claudeへのシンボリックリンクになっていて、.credentials.jsonは残っていたと書かれています。Linuxでの認証情報の保存先は~/.claude/.credentials.jsonです。

つまり、再起動後に起きるのは次の流れです。

  1. claudeが見つからない
  2. ネイティブインストーラを再実行する
  3. 起動してログイン画面が出る

3番目まで進むと、認証が消えたように見えます。報告者はこの見え方を「バイナリの消失が認証の消失に見える」と表現しています。報告されたバージョンはv2.1.15で、最後に動いていたのはv2.1.13とされています。

どちらが消えているかを切り分ける

再インストールの前に、次の3つを再起動直後に実行します。

which claude
ls -la ~/.claude/.credentials.json
readlink ~/.claude

結果の読み方は次のとおりです。

結果消えているもの向かう先
which claudeが何も返さない消えているもの実行ファイル向かう先次節以降の入れ直し
claudeは動くがログインを求められる消えているもの認証情報、または設定ファイル向かう先認証が本当に消えるときの確認先
readlink ~/.claudeが何も返さない消えているもの~/.claudeが通常のディレクトリで、保存先が永続領域とは限らない向かう先保存先を永続領域に寄せる

which claudeが/home/runner/.local/bin/claudeを指していたら、ネイティブ版です。このパスは再起動で消える領域にあります。

npmで入れ直す

報告者がたどり着いた解決策は、npmのグローバルインストールに戻すことでした。Replitのnpmはグローバルのプレフィックスがワークスペース内に設定されていて、npm config get prefixが/home/runner/workspace/.config/npm/node_globalを返すと書かれています。この場所に入れたものは再起動後も残ります。

npm config get prefix
npm install -g @anthropic-ai/claude-code
which claude
claude --version

which claudeの結果にworkspaceが含まれていれば、再起動後も残る場所に入っています。issueでは次の1行で確認しています。

which claude | grep -q workspace && echo "persist" || echo "NOT persist"

報告者の戻し方は、先にネイティブ版を消してからnpmで入れ直す順序です。

rm -rf ~/.local/share/claude ~/.local/bin/claude
rm -rf /home/runner/workspace/.local/share/claude /home/runner/workspace/.local/bin/claude
npm install -g @anthropic-ai/claude-code

Claude Code側のドキュメントも、npm版を正規のインストール方法の1つとして載せています。npmパッケージはネイティブ版と同じバイナリを入れる構成で、プラットフォームごとのオプション依存パッケージ(たとえば@anthropic-ai/claude-code-darwin-arm64)経由で取得され、インストール後の処理で所定の位置にリンクされます。Node.jsは22以降が必要で、古い版ではEBADENGINEの警告が出ますが、インストールは完了すると説明されています。更新はnpm install -g @anthropic-ai/claude-code@latestで、npm update -gは避けるよう書かれています。

issueの時点(v2.1.15)と現在では、npm版の中身の持ち方が変わっている可能性があります。issueの出力ではcli.jsにリンクされていましたが、現在のドキュメントはバイナリへのリンクと説明しています。ただし、リンク先がどちらでも、npmのプレフィックスがワークスペース内にあれば置き場所は永続領域のままです。

ネイティブ版のまま使いたいとき

公式はネイティブインストールを推奨とし、バックグラウンドで自動更新される点を利点に挙げています。Replitでnpmに戻すと、更新はnpm install -gで自分で行うことになります。ネイティブ版を保ちたい場合の選択肢を、根拠の強さ順に挙げます。

Replit側の依存関係管理を使う

issueにClaude Codeチームが返したコメントは、Replitに詳しくないと断った上で、標準的な入れ方はNixによるシステム依存だろう、というものでした。ReplitのドキュメントにはNixのreplit.nixにシステムレベルの依存を足す手順があり、パッケージはsearch.nixos.orgで探せます。ただし、ReplitのそのページはClaude Codeに触れておらず、replit.nixで入れた結果もissueには載っていません。

インストール先を環境変数で動かす

トラブルシュートのページによると、XDG_DATA_HOME、XDG_STATE_HOME、XDG_CACHE_HOMEを設定するとインストーラは~/.local/share、~/.local/state、~/.cacheの代わりにそれらを使います。CLAUDE_CONFIG_DIRを設定すれば、グローバル設定ファイルはホームではなくそのディレクトリに置かれます。

これらを/home/runner/workspace以下に向けるのは、ドキュメント上は成り立つ構成です。起動用リンクの~/.local/binはこの一覧に含まれないので、PATHの調整は別に考える必要があります。Replitでこの構成を試した報告はissueにありません。試すなら、再起動前後に切り分けの3コマンドで確かめてください。

認証だけでも再起動に強くする

実行ファイルをどう置くにせよ、ログインのやり直しだけは避けられる方法があります。claude setup-tokenで1年有効なOAuthトークンを作り、CLAUDE_CODE_OAUTH_TOKEN環境変数に設定する方法です。ブラウザでのログインが使えない環境向けとして説明されていて、トークンはどこにも保存されないので、自分で控えて環境変数に入れます。再起動後も残る環境変数の置き場所をReplit側で用意しておけば、新しいセッションでもトークンが読まれます。

トークンを設定した状態で/loginを実行しても、次の新しいセッションでは変数が再び読まれます。ログインし直したいときは、変数を外してから行います。期限切れのトークンを差し替えるときは、新しく作って再起動します。

このトークンを使えるのは、Pro、Max、Team、Enterpriseのいずれかのプランです。モデルへのリクエストしか送れないため、Remote Controlのセッションや、claude.aiのコネクタの取得には使えません。ローカルで設定したMCPサーバーは従来どおり動きます。--bare付きで起動するスクリプトはこの変数を読まないので、その場合はANTHROPIC_API_KEYかapiKeyHelperで認証します。

認証が本当に消えるとき

切り分けで「claudeは動くのに毎回ログインを求められる」となった場合は、実行ファイルの話ではありません。確認の順序は次のとおりです。

  1. readlink ~/.claudeで、保存先が永続領域を指しているかを見る
  2. ~/.claude.jsonの置き場所を見る。この設定ファイルは~/.claudeの外にあり、ドキュメントのアンインストール手順でも別々に削除する扱いです。issueが示すシンボリックリンクは.claudeだけで、.claude.jsonには触れていません
  3. CLAUDE_CONFIG_DIRを永続領域に向ける。認証情報の.credentials.jsonもこのディレクトリの下に置かれます
  4. ANTHROPIC_API_KEYやCLAUDE_CODE_OAUTH_TOKENが環境に残っていないかを見る。優先順位は、クラウドプロバイダーの認証、ANTHROPIC_AUTH_TOKEN、ANTHROPIC_API_KEY、apiKeyHelper、CLAUDE_CODE_OAUTH_TOKEN、/loginの順です

3の設定を反映して診断する例です。

export CLAUDE_CONFIG_DIR=/home/runner/workspace/.claude
claude doctor

claude doctorは、セッションを始めずにインストールと設定の診断を出力します。

どの認証が使われているかは、claudeを起動して/statusで確かめられます。ログインとAPIキーの両方が設定されている場合、使われていないほうの認証情報には印が付きます。

起動時に壊れ方を検知する

issueは、プロジェクトの.bashrcや起動スクリプトに次のような検査を足す案を載せています。ネイティブ版が混ざったときに、永続領域の外にあることを警告します。

if ! which claude &>/dev/null || ! which claude 2>/dev/null | grep -q workspace; then
  echo "WARNING: Claude Code is not in the persistent workspace"
  echo "Run: npm install -g @anthropic-ai/claude-code"
fi

チームで同じReplのプロジェクトを使うなら、READMEにnpmでの入れ方を1行書いておくと、各自がネイティブインストーラを実行して同じ症状を踏むのを防げます。

同じ症状が出そうな環境

issueの報告者は、ホームが一時的でプロジェクト領域だけが永続する環境として、Gitpod、GitHub Codespaces、Cloud9、ボリュームを付けないDockerコンテナも同じ影響を受けるかもしれないと書いています。Replit以外で再現した報告はこのissueの範囲にはありません。

実際に手順があるものは、別記事にあります。CodespacesはClaude CodeをGitHub Codespacesで使う手順、DockerはClaude Code Docker実行ガイドで認証の永続化まで扱っています。ログインの段階で「Invalid code」が出るときはCodespacesのログイン失敗の原因が近い症状です。Replit Agentとの役割の違いはClaude CodeとReplit Agentの違いにまとめています。

再起動を前提にした置き場所の決め方

Replitのように再起動で消える領域を持つ環境では、実行ファイルと認証情報を別々に考えると原因が絞れます。実行ファイルはnpmのグローバルインストールで永続領域に置き、認証情報は~/.claudeの保存先とCLAUDE_CONFIG_DIRで確かめる。それでもログインを繰り返す環境では、CLAUDE_CODE_OAUTH_TOKENに逃がす。この順で片づけば、毎回の入れ直しは要らなくなります。

修正がClaude Code側に入るかどうかは、issue #20163の状態で追えます。

この記事を共有:XはてブLinkedIn