Claude Media
Claude Codeがdefines.jsonのエラーで動かない — Syntax Errorの切り分け

Claude Codeがdefines.jsonのエラーで動かない — Syntax Errorの切り分け

Windowsでwinget・npm・ps1・cmdのどれで入れても「defines.json」のSyntax Errorが出る不具合の症状と、コメントで見つかったNODE_ENV環境変数の切り分け手順、WSLへの退避をまとめます。

Windowsでwinget、npm、PowerShellのinstall.ps1、CMDのinstall.cmdのどれを使っても、claude --versionがdefines.jsonのSyntax Errorで落ちる。この不具合がGitHub issue #85663で報告されています。issueはopenのままで、コメント4件はいずれも利用者によるものです。Anthropic側の回答や修正バージョンの記載はありません。

コメントの1つに、手元で試せる手がかりがあります。環境変数NODE_ENVにパス文字列が入っていると再現し、消すかtestなどに変えると直る、という報告です。インストール方法を変えても結果が同じなら、まず環境変数を疑う価値があります。

報告されている症状

issueのログは、次の形です。

1 | "C:\Program Files\nodejs"
    ^
error: Syntax Error
    at defines.json:1:1

1行目の先頭にあるのは、C:\Program Files\nodejsという引用符つきの文字列です。ドライブ文字の代わりに、置換されなかったテンプレートのプレースホルダー<drv>が入った形も、1度だけ見られたとあります。

報告者の条件は次のとおりです。

  • OSはWindows、ターミナルはWindows Terminal
  • npm install -g @anthropic-ai/claude-code、irm https://claude.ai/install.ps1 | iex、install.cmd、winget install Anthropic.ClaudeCodeの4通りすべてで発生
  • インストール後にclaude --versionを実行した時点で毎回出る
  • 以前は動いておらず、「最初から動かなかった」という回答

バージョンはclaude --version自体が動かないため不明です。報告者は、Node.jsを完全にアンインストールして再起動してもエラーが続くこと、nodejsをPATHから一時的に外しても変わらないこと、%SystemDrive%がC:を返すことも確かめています。

別の利用者は、Claude Desktopアプリを更新した直後から、アプリでもVS Codeでも同じエラーで使えなくなったと書いています。つまりCLI単体の問題ではなく、Claude Codeを呼び出す経路全体で起きています。

なぜ4通りとも同じ結果になるのか

インストール方法を変えても変わらないのは、失敗しているのがインストール作業ではなく、できあがったclaudeを実行する段階だからだと考えると筋が通ります。

セットアップ手順のページによると、PowerShellインストーラーはclaude.exeを%USERPROFILE%\.local\binに置きます。トラブルシューティングのページには、PowerShellインストーラーが.ps1スクリプトでなくバイナリを入れるとあります。npm版も、プラットフォーム別のネイティブバイナリをオプション依存として取得し、postinstallでclaudeとして配置する仕組みです。入口は違っても、最終的に動くのは同じ種類の実行ファイルです。

そのため、どの入口から入れても、実行時に読み込む環境が同じなら同じ場所で落ちます。この部分は、issueの報告内容と公式の仕組みからの推論です。Anthropicがこの原因を確認したわけではありません。

一方で、Node.jsをアンインストールしてもエラーが変わらなかった点は、ディスク上のファイルでなく、プロセスの環境に値が残っていることと整合します。ログの"C:\Program Files\nodejs"は、パスを表す文字列がJSONとして解釈されようとして失敗している形に見えます。JSONの文字列では\Pのようなバックスラッシュの並びが不正な記法になるため、Syntax Errorになるのは自然な結果です。

NODE_ENVを疑う根拠

issueのコメントに、次の報告があります。

This is reproducible if the environment variable NODE_ENV=C:Program Files\node.js, and likewise removing it or setting it to e.g. test instead fixes the issue.

NODE_ENVは本来developmentやproduction、testのような短い語を入れる変数です。ここにドライブ文字の後ろのバックスラッシュが抜けたC:Program Files\node.jsのような値が入っていた、というのが報告の内容です。

この報告者と、元のissueの報告者が同じ原因だったかは分かりません。元の報告者のログにある値はC:\Program Files\nodejsで、コメントの値とは綴りが違います。それでも、症状が一致していること、環境変数を消すだけで直ったという具体的な報告があることから、最初に試す価値のある切り分けです。

別のコメントは、設定を空にして起動する検証用の.cmdを提案しています。投稿者自身が「再現はしていない。原因の確認用であって修正ではない」と断っているので、その前提で使います。

手順1:今のシェルの値を確認する

まず、いま使っているシェルにNODE_ENVとNODE_OPTIONSが設定されているかを見ます。PowerShellなら次のとおりです。

$env:NODE_ENV
$env:NODE_OPTIONS

CMDならechoで確認します。未設定の場合、%NODE_ENV%という文字列がそのまま表示されます。

echo %NODE_ENV%
echo %NODE_OPTIONS%

developmentやproductionのような短い語、または空であれば、少なくとも報告されたパターンには当たりません。パスらしい文字列が出たら、手順2へ進みます。

手順2:どこで設定されているかを探す

環境変数は、ユーザー単位、マシン単位、そのシェルの中だけ、の3か所のいずれかで設定されています。現在のシェルに出た値が、どこから来たのかを切り分けます。

[Environment]::GetEnvironmentVariable('NODE_ENV', 'User')
[Environment]::GetEnvironmentVariable('NODE_ENV', 'Machine')

Userに値があれば、自分のアカウントの環境変数です。Machineにあれば、PC全体の設定で、変更には管理者権限が要ります。どちらにも無いのに現在のシェルに値があるなら、$PROFILEなどの起動スクリプトか、そのシェルを起動した親プロセスが設定しています。

手順3:不要な値を消して試す

見つかった場所に応じて、値を取り除きます。ユーザー単位の値は、PowerShellから次のように削除できます。

[Environment]::SetEnvironmentVariable('NODE_ENV', $null, 'User')

マシン単位の値は、管理者として開いたPowerShellで'Machine'を指定して同じ操作をします。GUIで消すなら、スタートメニューで「環境変数を編集」を検索し、該当の変数を削除します。

ここで注意が要るのは、設定を変えても、すでに起動しているプロセスには反映されない点です。次の順で確かめます。

  1. 開いているターミナルをすべて閉じ、新しいターミナルを開く
  2. claude --versionを実行する
  3. Claude DesktopやVS Codeから使っている場合は、アプリも完全に終了して起動し直す

元のシェルを開いたまま一時的に試すだけなら、そのシェルの中だけ変数を外せます。

Remove-Item Env:NODE_ENV -ErrorAction SilentlyContinue
claude --version

この方法で版番号が出れば、原因はその変数です。恒久的に直すには、手順2で見つけた場所から設定を取り除きます。

.cmdで環境を切り離して試す

コメントで提案されていた検証方法は、設定を空にしてからclaudeを呼ぶ.cmdファイルです。名前をtest claude.cmdなどにして保存し、ダブルクリックします。

@echo off
set "NODE_ENV="
set "NODE_OPTIONS="
call claude
pause

通常のターミナルでは失敗し、この.cmdからは起動するなら、環境が原因です。pauseでウィンドウが閉じないので、エラー文を読み取って画面を撮れます。issueにコメントを足すときの材料にもなります。逆に、この方法でも同じエラーが出るなら、NODE_ENVとNODE_OPTIONS以外の変数、または別の原因が残っています。

似たエラーとの見分け方

Windowsでの導入失敗には、defines.jsonとは別の原因もあります。トラブルシューティングのページに載っているものを、症状で並べます。

画面に出る文言原因の方向対応するページの節
'irm' is not recognized原因の方向CMDでPowerShell用コマンドを実行した対応するページの節Wrong install command on Windows
running scripts is disabled on this system原因の方向npmの.ps1ランチャーが実行ポリシーで止まった対応するページの節同名の節
The process cannot access the file ... because it is being used by another process原因の方向ダウンロードフォルダーが別の処理や、ウイルス対策ソフトに使われている対応するページの節同名の節
'claude' is not recognized原因の方向PATH未設定、または更新時にclaude.exeが消えた対応するページの節Verify your PATH、claude.exe missing after an update
defines.jsonのSyntax Error原因の方向本記事の症状。エラー一覧に項目なし対応するページの節issue #85663

最後の行は、トラブルシューティングのページのエラー一覧にdefines.jsonの項目が無いことを示します。'claude' is not recognizedは、claude.exeが見つからない状況です。defines.jsonのエラーは、実行ファイルは見つかって起動した後に出ています。表示される文言が違うので、混同しにくいはずです。

PATHの確認や、更新で失われたバイナリの復旧は、Claude Codeのインストール手順とWindows向けのネイティブとWSLの選び方で扱っています。

直らないときの選択肢

環境変数を片づけても変わらない場合の、報告済みの選択肢が2つあります。

WSL上に入れる

元の報告者と同じエラーに当たった別の利用者は、WindowsでなくWSL環境にインストールして実行したところ、問題なく動いたと書いています。手順は、WSLのディストリビューションのターミナルを開き、Linux用のインストールコマンドを使うだけです。PowerShellやCMDからではなく、WSLのターミナルの中で入れて起動します。

この場合、WSLの~はWindowsのユーザーフォルダーとは別のホームです。~/.claudeの設定やMCPの構成は、Windows側から引き継がれません。詳しい違いはClaude CodeをWSL2で使うにあります。

issueに情報を足す

この不具合は、原因が絞り込まれていません。報告を足すなら、トラブルシューティングのページが案内する項目(OSと、実行したインストールコマンド、エラー全文)に加えて、次の点が役に立ちます。

  • NODE_ENVとNODE_OPTIONSの値(ユーザー、マシン、現在のシェルの3か所)
  • 環境変数を外した新しいターミナルで、結果が変わったかどうか
  • Claude Desktop経由でも同じエラーが出るか

claude doctorはこのエラーの状態では実行できない場合があります。claude --versionが動かないときは、まず版番号が出る状態まで戻すことが先です。

環境変数を直したあとの確認

claude --versionで版番号が出たら、動作確認として、バイナリの場所を確認しておくと、複数の入れ方が混在していないかが分かります。

Get-Command claude | Select-Object Source

wingetで入れたものは自動更新されないため、winget upgrade Anthropic.ClaudeCodeで更新します。npm版と併存している場合は、どちらが優先されているかをこの出力で判断できます。複数の入れ方が混ざった状態は、別の混乱の元になります。使わないほうを外して、一本化するのが後々の切り分けを楽にします。

まとめ

defines.jsonのSyntax Errorは、入れ方を変えても直らないため、インストーラーの不具合に見えます。issueに残った手がかりは、NODE_ENVに誤ったパスが入っている環境で再現し、変数を外すと直ったという1件の報告です。再現条件がそろうのはこの1件にとどまり、公式の確認は出ていません。

手順は、NODE_ENVとNODE_OPTIONSを確かめ、パスが入っていれば取り除いて、新しいターミナルで試すこと。外しても同じなら、WSLへ入れる方法があります。いずれの場合も、Node.jsの再インストールを繰り返す前に、環境変数の確認から始めるほうが、手戻りが少なくなります。

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