Agentforce Vibesの「spawn ENAMETOOLONG」の原因と対処【2026年版】

spawn ENAMETOOLONG とは、プログラムが別のプロセスを起動しようとしたときに、起動コマンドが長すぎて OS に拒否されたことを示すエラーです。Windows ではコマンドラインの長さに 32,767 文字の上限があります。

Agentforce Vibes を使っていて、ある日チャットに何を送ってもこのエラーしか返らなくなった。「Hi」の2文字でも失敗し、新しいセッションでも、VS Code や PC の再起動でも直らない。わたしたちは 2026-09-04 にこの状態になりました。

原因は、Agentforce Vibes に入っている「スキル」の件数が自動更新で 180 件に増え、起動コマンドが Windows の上限を超えたことでした。この記事は、原因を突き止めるまでの経過と、5日で3回再発した末にたどり着いた恒久策の記録です。

この記事でわかること

  • Agentforce Vibes で spawn ENAMETOOLONG が出る仕組み(スキルの件数とユーザー名の長さ)
  • 自分の環境が該当するかを1分で判定する PowerShell スクリプト
  • スキルの自動更新を止める設定と、それでも超えるときの退避手順
  • 原因を突き止めた手がかり(ログのサイズ、更新時刻、エラーが返るまでの時間)
検証した環境:Windows 11 Pro、VS Code、Agentforce Vibes 拡張機能 4.27.0〜4.37.0、スキルパッケージ 1.41.0〜1.53.0(2026-09-04〜2026-10-06)。macOS では確認していません。本記事の対処は非公式の回避策です。拡張機能の更新で挙動が変わる可能性があります。

目次

用語ミニ辞典

用語意味
Agentforce VibesSalesforce 公式のAI開発環境。VS Code などに入れる拡張機能版を使った
スキル「この作業はこの手順で」と AI に指示する手順書(Markdown 文書)。製品領域ごとに大量に配布されている
ツールオブジェクト作成やデプロイを実際に行う機能。Salesforce DX MCP サーバーが提供する
子プロセスあるプログラムが別のプログラムを起動したときの、起動された側
spawn子プロセスを起動する処理。起動コマンドが長すぎると ENAMETOOLONG で失敗する

全体像:起動コマンドにスキルのパスが全件つながる

Agentforce Vibes は、チャットを送るたびに裏で AI エージェントを子プロセスとして起動します。そのとき、有効なスキルの保存場所(絶対パス)を全件、起動コマンドの引数に文字列としてつなげて渡します。

Agentforce Vibes の仕組み。VS Code 拡張機能が AI エージェントを子プロセスとして起動する。起動コマンドの引数は --allowedTools(スキルのパス180件で31,659文字)、--mcp-config(2,012文字)、その他の固定引数(約400文字)で合計34,071文字になり、Windows のコマンドライン上限32,767文字を超えて spawn ENAMETOOLONG になる。メッセージ本文は標準入力で渡すため上限の対象外

わたしたちの環境での内訳は次のとおりでした。

引数文字数
--allowedTools(スキル 180 件のパス)31,659
--mcp-config2,012
その他の固定引数(概算)400
合計34,071
Windows のコマンドライン上限32,767
超過1,304

入力したメッセージ本文は、引数ではなく標準入力で渡されます。だから「Hi」の2文字でも失敗します。入力の長さとは関係なく、起動の時点で落ちているためです。

⚠️ 先に知っておきたい3点

  • 同じ件数でも、ユーザー名が長い人だけ発生する。パスには C:\Users\<ユーザー名>\... が含まれ、180件ぶん繰り返されます。わたしたちの環境ではユーザー名が全角を含む22文字で、それだけで約4,000文字を占めていました(→FAQ5)
  • スキルを減らしても、Vibes の実行能力は落ちない。上限に当たっているのはスキル(手順書)だけです。オブジェクト作成やデプロイを行う74個のツールには手を付けません(→FAQ3)
  • スキルを退避しても、自動更新で元に戻る。わたしたちは5日で3回再発しました。恒久策は自動更新を止めることです(→再発の記録)

手順編:判定して、自動更新を止める

対処の流れ。判定する、自動更新を止める、VS Code を再読み込み、ログで autoUpdateOn=false を確認、まだ超えるなら使わない分類のスキルを移動する。拡張機能の更新で同梱スキルが増えたら判定からやり直す。自動更新を止めても拡張機能本体の更新までは止められない

手順1:該当するかを判定する

  1. PowerShell を開く(VS Code は開いたままでよい)
  2. 次のスクリプトを貼り付けて実行する
$S = "$env:APPDATA\Code\User\globalStorage\salesforce.salesforcedx-einstein-gpt\v4\skills\Skills-Salesforce"; if (-not (Test-Path $S)) { "スキルフォルダなし(対象外)" } else { $d = Get-ChildItem $S -Directory; $a = (($d | ForEach-Object { "Skill(" + ($_.FullName -replace '\\','/') + ")" }) -join ',').Length; $t = $a + 2400; "スキル件数 : $($d.Count)"; "推定引数長 : $t / 上限 32767"; if ($t -gt 32767) { "判定       : 該当(対処が必要)" } else { "判定       : 非該当(余裕 $(32767 - $t) 文字)" } }
  1. 「判定:該当」と出たら手順2へ進む。「非該当」でも、余裕が数千文字しかなければ手順2を先に入れておく
  2. 推定引数長は、スキルのパスの合計に、--mcp-config とその他の固定引数の概算(2,400文字)を足した値です
  3. ユーザー名に依存しないよう、パスは $env:APPDATA から組み立てています

手順2:スキルの自動更新を止める

  1. %APPDATA%\Code\User\settings.json を開く
  2. 次の1行を追記して保存する
"salesforce.einsteinForDevelopers.skills.autoUpdate": false
  • これは設定画面には出てこない、非公開の設定キーです。拡張機能の同梱コードを確認して見つけました。既定値は true です
  • 保存すると、settings.json に「不明な構成設定」という警告が出ます。設定画面に定義がないためで、拡張機能は読み込みます(→FAQ4)
  • false にしてもスキルが無効になるわけではありません。取得元が「最新版の自動ダウンロード」から「拡張機能に同梱された版」に切り替わります

わたしたちは、あとで見返せるようコメントを付けて書きました。

// spawn ENAMETOOLONG 対策。スキルの自動更新を止め、拡張機能の同梱版に固定する。
// 設定画面には出ない非公開キーのため「不明な構成設定」と警告が出るが、拡張機能は参照する。
"salesforce.einsteinForDevelopers.skills.autoUpdate": false

手順3:VS Code を再読み込みする

  1. コマンドパレット(Ctrl+Shift+P)を開く
  2. Developer: Reload Window を実行する

手順4:ログで効いていることを確認する

  1. VS Code の出力パネルか拡張機能のログで、次の行を探す
skills.feature.activateComplete  autoUpdateOn=false refreshAttempted=false seedFallback=false
  1. autoUpdateOn=false になっていれば設定が効いている
  2. 手順1の判定スクリプトをもう一度実行し、「非該当」になったことを確かめる。まだ「該当」なら番外編の退避へ進む

わたしたちの環境では、自動更新を止めたことでスキルが 227 件から 121 件(同梱版)になりました。推定引数長は 42,565 文字から 23,321 文字に下がりました。

番外編:それでも超えるときの退避と復元

自動更新を止めても上限を超える場合は、使わない製品領域のスキルを別のフォルダへ移します。削除はせず、移動にします。判断を誤っても戻せるようにするためです。

⚠️ 非公式の回避策です
拡張機能が管理するフォルダを直接動かします。Salesforce が案内している手順ではありません。実行は自己責任で、まず手順1の判定から始めてください。

退避する分類の決め方

すべてのスキルの SKILL.md にある description(どんなときに使うか)を読み、担当プロジェクトで使わない製品領域を退避しました。

残した分類退避した分類
platform-*(オブジェクト・項目・権限・Apex・SOQL・デプロイ)service-*(Service Cloud、メッセージング、音声)
dx-*(sf CLI、組織管理、Code Analyzer)experience-ui-bundle-* ほか(Experience Cloud サイト、CMS)
experience-* のうち LWC 系omnistudio-*、commerce-*、mobile-*
agentforce-*、integration-*、automation-*(Flow 生成)consumer-goods-*、data360-*、education-*、field-*、life-*
design-systems-*(SLDS)—

分類ごとの件数は、次のスクリプトで確かめられます。

$S = "$env:APPDATA\Code\User\globalStorage\salesforce.salesforcedx-einstein-gpt\v4\skills\Skills-Salesforce"; Get-ChildItem $S -Directory | ForEach-Object { ($_.Name -split '-')[0] } | Group-Object | Sort-Object Count -Descending | Select-Object Count, Name | Format-Table -AutoSize

退避する(何度でも実行できる)

$S = "$env:APPDATA\Code\User\globalStorage\salesforce.salesforcedx-einstein-gpt\v4\skills\Skills-Salesforce"; $B = "$env:LOCALAPPDATA\afv-skills-disabled"; $O = "$env:LOCALAPPDATA\afv-skills-disabled-old"; New-Item -ItemType Directory -Force -Path $B | Out-Null; $pat = '^(service-|experience-(ui-bundle|cms|content-media|lwr-site|portal)|omnistudio-|commerce-|consumer-|mobile-|education-|data360-|field-|life-)'; $keep = @('service-agentforce-channel-configure'); $m = 0; $a = 0; foreach ($f in (Get-ChildItem $S -Directory | Where-Object { $_.Name -match $pat -and $keep -notcontains $_.Name })) { $dest = Join-Path $B $f.Name; if (Test-Path $dest) { New-Item -ItemType Directory -Force -Path $O | Out-Null; if (Test-Path (Join-Path $O $f.Name)) { Remove-Item (Join-Path $O $f.Name) -Recurse -Force }; Move-Item $dest (Join-Path $O $f.Name); $a++ }; Move-Item $f.FullName $dest; $m++ }; "退避した件数      : $m"; "旧版を待避した件数: $a"; "残った件数        : $((Get-ChildItem $S -Directory).Count)"
  1. 上のスクリプトを実行する
  2. VS Code を再読み込みする(手順3と同じ)
  3. 手順1の判定スクリプトで「非該当」になったことを確かめる
  4. 退避先は %LOCALAPPDATA%\afv-skills-disabled です
  5. 退避先に同じ名前のフォルダがあるときは、古いほうを afv-skills-disabled-old に移してから入れ替えます
  6. $pat が退避する分類、$keep が例外として残すスキルです。自分のプロジェクトに合わせて書き換えてください

復元する

$S = "$env:APPDATA\Code\User\globalStorage\salesforce.salesforcedx-einstein-gpt\v4\skills\Skills-Salesforce"; $B = "$env:LOCALAPPDATA\afv-skills-disabled"; $n = 0; Get-ChildItem $B -Directory | ForEach-Object { $dest = Join-Path $S $_.Name; if (-not (Test-Path $dest)) { Move-Item $_.FullName $dest; $n++ } }; "戻した件数    : $n"; "戻した後の件数: $((Get-ChildItem $S -Directory).Count)"
  • 退避先ごと消してしまった場合も復元できます。Skills-Salesforce フォルダを削除し、コマンドパレットから Agentforce: Refresh Salesforce Skills を実行すると再ダウンロードされます。ただし件数が戻るので、再発します

原因を突き止めるまで

エラーの文言だけでは原因がわかりません。わたしたちが何を疑い、何で否定したかを順に書きます。同じ症状で調べている方の近道になればと思います。

環境変数を疑った(否定)

Windows の spawn で ENAMETOOLONG が返るのは、コマンドラインか環境変数ブロックが 32,767 文字を超えたときです。まず環境変数を測りました。

$env_pairs = [System.Environment]::GetEnvironmentVariables(); $total = 0; foreach($k in $env_pairs.Keys){ $total += ($k.Length + $env_pairs[$k].ToString().Length + 2) }; "ENV_BLOCK_CHARS=$total"; "PATH_LEN=" + $env:PATH.Length

結果は環境変数ブロック全体で 4,434 文字、PATH は 1,134 文字でした。上限には遠く、環境変数は原因ではないと判断しました。

エラーが返るまでの時間:22ミリ秒

拡張機能のログでは、エラーが 22 ミリ秒で返っていました。外部の AI と通信していれば、この速さでは返りません。通信の前、手元で落ちていることがわかります。

status=error error="spawn ENAMETOOLONG" durationMs=22 llmCallCount=1 toolCallCount=0

スタックトレースは ChildProcess.spawn から拡張機能内の spawnLocalProcess → initialize へ続いていました。子プロセスの起動そのものが失敗しています。

デバッグログのサイズで、壊れた時刻を絞り込む

拡張機能のデバッグログ(agent-storage\claude-debug-logs\)のサイズが決め手になりました。

日時サイズ判定
2026-09-03 10:13853,247 バイト正常
2026-09-03 10:571,101,609 バイト正常
2026-09-03 14:392,556,436 バイト正常
2026-09-03 15:05 以降すべて 279 バイト異常

279 バイトのログは「Turn started」のヘッダーだけで終わっていました。ターンは始まるのに、子プロセスが一度も起動できていません。14:39 と 15:05 の間に何かが変わったことになります。

引数の中身を数える

エージェントの設定ファイル(agent-storage\agents\ 配下)を見ると、スキルは名前ではなく絶対パスの配列で、180 件で 30,761 バイトありました。1 件あたり平均 168 文字で、そのうち約 133 文字は全件に共通する保存先のパスです。冒頭の内訳表のとおり、合計すると上限を 1,304 文字超えていました。

更新時刻を突き合わせて、引き金を特定する

スキルフォルダの version.json には、取り込んだ時刻が入っていました。

{"version":"1.46.0","seedTimestamp":1788414301002}

seedTimestamp を日本時間に直すと 2026-09-03 14:45:01 です。デバッグログの境界(14:39 正常 → 15:05 異常)の間に収まります。スキルパッケージ @salesforce/afv-skills が 1.46.0 に自動更新され、スキルが 180 件に増えたことが引き金でした。

再発の記録

最初はスキルの退避で直しました。ところが、退避は恒久策になりませんでした。スキルが自動更新されると、退避したぶんが全件再ダウンロードされて元に戻るためです。

3つの状態の対比。発生時(09-03)はスキル180件・推定引数長34,071で1,304超過、起動できない。退避だけ(09-04)は96件・18,945で13,822の余裕だが、自動更新で元の件数に戻る。自動更新オフ(現在)は同梱版164件・31,076で1,691の余裕、拡張機能の更新で増えうる

日付何が起きたかスキル件数推定引数長
2026-09-04最初の対処。84 件を退避180 → 9634,071 → 18,945
2026-09-071.51.0 に自動更新。退避分が戻り、新しい分類(field-*、life-*)も増えた96 → 22842,565(超過)
2026-09-091.53.0 に自動更新。再び戻る100 → 22742,565(超過)
2026-09-09自動更新を止める。同梱版に固定227 → 12123,321
2026-09-15 以降拡張機能本体が 4.33.0 以降に更新され、同梱スキルが増えた121 → 16431,076(余裕 1,691)

5日で3回の再発を受け、手作業の退避では回らないと判断して自動更新を止めました。それでも、拡張機能本体の更新で同梱スキルは増えます。2026-10-06 時点の余裕は 1,691 文字で、スキル約10件ぶんしかありません。拡張機能を更新したら、手順1の判定を実行する運用にしています。

つまずき&FAQ

Q1. 「Error (UNKNOWN): spawn ENAMETOOLONG」が出て、Agentforce Vibes のチャットが何を送っても動かない

Windows で Agentforce Vibes のスキルが増えすぎ、子プロセスの起動コマンドが 32,767 文字の上限を超えている可能性が高いです。手順1の判定スクリプトで確かめ、該当していれば自動更新を止めてください。わたしたちの環境では 180 件で発生しました。

Q2. VS Code を再起動しても、PC を再起動しても直らない

再起動では直りません。原因は起動のたびに組み立てられる引数の長さで、スキルの件数が変わらない限り毎回同じ長さになるためです。新しいセッションを作っても同じです。

Q3. スキルを減らすと、Agentforce Vibes でできることが減りますか

減りません。上限に当たっているのはスキル(AI への手順書)だけです。オブジェクトや項目の作成、デプロイ、SOQL の実行などを実際に行うのはツール(Salesforce DX MCP サーバーの74個)です。ツールは起動後に標準入出力でやりとりするため、長さの問題を起こしません。退避するのは、担当プロジェクトで使わない製品領域の手順書だけです。

Q4. settings.json に「不明な構成設定」と警告が出る

正常です。salesforce.einsteinForDevelopers.skills.autoUpdate は設定画面に定義されていない非公開のキーなので、VS Code が警告を出します。拡張機能は読み込みます。効いているかは、ログに autoUpdateOn=false が出ているかで確かめてください。

Q5. 同じチームでも、発生する人としない人がいる

ユーザー名の長さの違いです。スキルのパスには C:\Users\<ユーザー名>\AppData\Roaming\Code\... が含まれ、それがスキルの件数ぶん繰り返されます。ユーザー名が長い人ほど早く上限に届き、短い人は同じ件数でも発生しません。

Q6. 退避したはずのスキルが元に戻っている

スキルの自動更新で再ダウンロードされています。手順2で自動更新を止めてください。なお、自動更新を止めたあとに手動で退避しても、拡張機能が同梱版を再コピーして、次回の起動時に同梱版の構成へ戻ることがあります。

Q7. スキルがあるのに「見つかりません」と言われる

スキルは、検索でヒットしてから読み込まれます。スキル名(フォルダ名)を直接指定すると、検索の語彙と噛み合わずに外れることがあります。「カスタム項目を作って」のように用途で頼むほうが確実です。拡張機能の更新後に VS Code を再読み込みしていない場合は、古いスキル一覧のままになっていることもあります。

Q8. 同時に出ていた別のエラーも、同じ原因ですか

わたしたちの調査中には、モデルを切り替えたときのエラーと、Toolkit タブの MCP サーバーの赤表示も同時に出ていました。3つとも別々の原因でした。まとめて1つの原因を探すと遠回りになるので、1つずつ切り分けてください。MCP サーバーの有効化についてはAgentforce Vibesでフローを作るためのMCPサーバー設定手順にまとめています。

まとめ

  • Agentforce Vibes の spawn ENAMETOOLONG は、スキルのパスが全件つながった起動コマンドが Windows の上限 32,767 文字を超えたことで起きます。メッセージの長さとは関係ありません
  • スキルの件数とユーザー名の長さの組み合わせで決まるため、同じチームでも発生する人としない人がいます
  • 恒久策は、settings.json でスキルの自動更新を止めることです。退避だけでは更新のたびに元に戻ります
  • スキルを減らしても、実際の操作を行うツールは減りません
  • 自動更新を止めても拡張機能本体の更新で同梱スキルは増えます。更新後は判定スクリプトを実行します

調べる順番としては、エラーが返るまでの時間(22ミリ秒)とログのサイズ(279バイト)が最も早い手がかりでした。入力に関係なく失敗するエラーは、起動時の構成を疑うのが近道です。

Salesforce の開発と AI 活用のご相談を承っています

FROM CENTER は、Salesforce の設定・開発と、AI を使った開発の進め方を支援しています。次のようなお悩みがあれば、お気軽にご相談ください。

  • Agentforce Vibes を導入したいが、トラブル時の調べ方がわからない
  • AI 開発ツールをチームで使うときの設定や運用を決めたい
  • Salesforce の開発や保守に時間がかかっている

お問い合わせはこちら

Agentforce Vibes の初期設定はAgentforce Vibes セットアップ手順【日本語版】、実案件で使った所感はAgentforce Vibesを使ってみたにまとめています。

参考リンク

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です