この記事を作った動機

 Linux 環境にて簡単に Web アプリを作ろうとしたところ、以下のようになって開発サーバを立ち上げられない事態になり、開発が続行できなくなったということがあって、だいぶ時間を溶かしたので記録を取る。

npm create vite@latest
# ...

# npx でも症状は同じ
npm run dev 
# npm notice run rss-listing@0.0.0 dev
# npm notice run vite
# sh: 行 1: vite: command not found

簡単な結論

 npm を使ったプロジェクトを立ち上げる際は、フォルダのパスに特殊文字が含まれていないか注意する。:がパスに含まれていた場合、npm はそれを自動的にエスケープするなどの処理をせずに、PATHを登録してしまう。npm の機構によって動的にPATHが正しく登録できないと、npm でインストールされたパッケージのバイナリやスクリプトが必要なタイミングで実行できず、開発を続行できない。BASH の PATH の解釈が不正なところで途切れて、npm の動作に必要なバイナリやスクリプトへのパスが通らず、動作が破綻する。問題の具体例は以下のとおりである。

  • 問題のパスの例
# /home/useName/work/free/2026-08-18-09:16:14-1787012174/ProjectName/node_modules/.bin
  • 問題のパスが npm(npx) によって、PATH に登録される例
# /home/useName/work/free/2026-08-18-09:16:14-1787012174/ProjectName/node_modules/.bin:/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/opt/miniconda3/condabin:/usr/local/bin # 実際にはもっと長く続くが例として途中でちょん切っている。
  • BASH での解釈のされ方の例
# /home/useName/work/free/2026-08-18-09             # 意図しないところでパスがちょん切れる
# 16                                                # 意図しないところでパスがちょん切れる
# 14-1787012174/ProjectName/node_modules/.bin   
# /home/linuxbrew/.linuxbrew/bin
# /home/linuxbrew/.linuxbrew/sbin
# /opt/miniconda3/condabin
# /usr/local/bin
# ...

 なおこのような問題は、Windows など最初から、":" の文字がフォルダ名などに特殊文字として登録できないファイルシステムを使う環境では起こらないかもしれない。私が、普段の環境で使っているのは、Ext4 というファイルシステムであり、":“がファイル名やフォルダ名に含めることができ、問題が起こったものだと思われる。npm 関連のリポジトリにこれについて Issue を作ったり Pull Request を作るべきかは謎であるが、私はその点に関して自信は何もないので、結局何もしないだろう。

問題に至るまでの経緯

 最近他の人のブログを見ていて、RSS リーダー用のリンクをブログに貼っていたりする人たちが見受けられ、自分もやってみたいと思った。自分の Hugo ブログにも、RSS へのボタンをホームに追加してみていた。ただ私は、今まで RSS の利用経験がなかったので、自分のブログにせっかく RSS を貼ったなら他のブログを見るときに現れる RSS も使ってみたいと思ったところであった。しかし、RSS リーダーとして総称されるアプリを色々調べてみると複雑難解で使いづらそうという印象を受けた。

 そこで、シンプルな RSS リーダーを作ってみようと思った。技術選定には、使ったことがある、Python(バックエンド) と Vite(フロントエンド) の構成にしようと思った。途中で開発をやめる使い捨てプロジェクトになる可能性を考慮し、プロジェクトを初期化するために、自分であれこれmkdirなりしてディレクトリを用意するのは嫌だったので、自作のWorkspaceManagerなるツールを使った。

 WorkspaceManagerでは、事前にプロジェクト用に指定されたフォルダ内に、日付を中心とした名前のフォルダを作成し、その内部にテンプレートの readme.md を配置して、VS Code をそのフォルダをワークスペースディレクトリとして自動的に起動するまでの一連の流れを、workとコマンドを打つだけで行うものである。今回は、このWorkspaceManagerの日付を中心とした名前のフォルダを作成する機能と、npm(npx) の実行時に動的にパスを node_modules/.bin に対して通す機構が相性問題を起こしたことが、問題の中心にあったようである。

 npm(npx) では、PHP でいうところの escapeshellarg のような実装がなく、自分のWorkspaceManagerも特殊文字を使っていたことが重なり、問題になったということである。基本的に対策としては、-は問題にならないことが分かったので、WorkspaceManagerで生成されるフォルダ名を:から、-にすれば良さそうである。

メモ

npm において、動的にどんなPATHが生成されているか確認する方法

npm run env | grep PATH

# npm notice run rss-listing@0.0.0 env
# npm notice run env
# VSSCRIPT_PATH=/usr/lib/python3.14/site-packages/vapoursynth/libvsscript.so
# INFOPATH=/home/linuxbrew/.linuxbrew/share/info:
# ROCM_PATH=/opt/rocm
# PATH=/home/useName/work/free/2026-08-18-07:40:50-1787006450/RSS-Listing/node_modules/.bin:/home/useName/work/free/2026-08-18-07:40:50-1787006450/node_modules/.bin:/home/useName/work/free/node_modules/.bin:/home/useName/work/node_modules/.bin:/home/useName/node_modules/.bin:/home/node_modules/.bin:/node_modules/.bin:/usr/lib/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin:/usr/lib/jvm/java-26-openjdk/bin:/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:/opt/miniconda3/condabin:/usr/local/bin:/usr/bin:/usr/local/sbin:/opt/android-ndk:/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:/var/lib/flatpak/exports/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/opt/rocm/bin:/opt/android-ndk:/opt/android-sdk/cmdline-tools/latest/bin:/opt/android-sdk/platform-tools:/usr/local/vpnclient:/home/useName/.local/bin:/home/useName/.local/bin

今回のトラブルシュートにおける LLM 利用の感想

見たい人だけどうぞ

 今回も検索エンジンだけでなく、ローカルLLM (Gemma4-12b-qatやGemma4-31B) を使ったが、正直的はずれなことしか出力してこなかった。ネットで調べてもイマイチ今回の問題をピンポイントで、または何かしら掠っていて問題解決の助けになるサイトはあまり見つけられなかったので、結局そういうことなのだと思われる。LLM は基本的に学習データ元の多くのネットを使っているため、ネットにないことは出力できないということであり、結局自力で調査して調べるしかないということのようである。

 さらに言えば、私は今まで、LLM には詳細に情報をまとめて渡したほうがいいと思っていたが、違うかもしれない場合があることが分かった。たとえな今回では具体的なエラーなどのログや背景について説明する文章を配置し、そのうえで、viteなどに関してパスが通っていないことに関して調査したかったのに、ログのある部分を執拗に持ち出して、私が調べたいと主張しているところから遠ざかって、“お前は間違っている、私は正しい、従わないのが悪い"みたいな顔の出力してきて、精神衛生としては非常に最悪だった。今回の場合であれば、npm のパッケージのインストール数が少ないのがおかしい、正常にモジュールがインストールされていないに違いないと、LLM が勝手に自説を作り出してきて、ずっとセッション全体でこすり続けてきてマジでうざかった。私はプロンプトにて、node_modules/.bin配下に、viteのシンボルリンクがあり、それを直接絶対パスで叩くと動作することは明示していたが、平気で無視してきた。ユーザの技術力を信頼しない態度というか、確かにプログラミングにおいては、タイピングミスなどの些細な間違いが問題であることも多いが、にしてもひどい出力(しかも大きく的外れ)ばっかで余計にネットの騒いでいる言説って実際に使ったことがある人の意見なのかなと疑問に思うところでもあった。これは自分で調査して、LLM を信頼せずに一つの手段として使っている人には問題にならないかもしれないが、環境変数などについて何も知らない人が使ったら、LLM がでっち上げた勝手な仮説にずっと振り回され続けて、へし折れるのではないかと思うところである。なんていうか、その LLMモデルの挙動って、融通が効かず、絶対に自分が正しいと思って人の話は効かない迷惑な人みたいな振る舞いって感じで、今回のトラブルシュートのケースでは使って激しく後悔するものであった。セッション内で取り扱っている分野について知識や経験がない人を、永遠にコマのように使って、確率で出したことで当たれば自分の手柄かのようにLLMは出力し、はずれればユーザのせいという顔を"遠回し"の表現でしてきて、こんなところにもユーザを支配しようとする干渉的な出力が見受けられる。ガスライティングやらいろんな心理戦術が混じっていて、既存のLLMモデルはとても善意とは言えないものである。LLMを神格化したり称揚しない人々に対して、MOTHER 3 で言う善い人温泉やイカヅチタワーのような挙動をしてくる。

npm create vite@latest

# ◇  Installing dependencies with npm...
# 
# added 27 packages, and audited 28 packages in 13s
# 
# 9 packages are looking for funding
#   run `npm fund` for details

 もちろん私も間違っていることは多いが、ユーザが調べたい、調査したい方向に逆らって、LLM がどっかから引っ張り出してきた得体のしれない"自説"をユーザの指示に従わずにこすり続けてくるところは、おかしいと思う。ユーザが調べたい方向に対して、たとえば今回であれば、viteコマンドのパスが通らないことに関して、パスが通っていないことについて調べたいということに対して、動的に npm がどんなパスを生成しているか確かめる方法とか今回であれば、出してくれればいいものを、そういう事ができないところは、改めて LLM がただもっともらしい文字列を羅列し、考えたりしないとすぐに破綻するシーンでは基本的に利用者が物事を理解して軌道修正できる人でなければ、とても使い物になったものじゃないなと思ったところであった。

 この意見に対しては、“お前がLLMに対してうまくプロンプトを考えられないのが悪い"という者もいるかもしれないがそれは詭弁であると思われる。もしそれが出来るなら、そもそも LLM なんて使う意味がない、そもそも問題はユーザ側ですぐに解決しているということを意味しているからである。問題解決の一助として使いたいのに、問題解決をした人が知っている事を前提として、LLM が適切な出力が出来るように導くようにプロンプトを書けというのは矛盾であり、LLM モデルに限界がある事から矛先をそらしているものだと見受けられる。LLM は責任の取れない主体のない機械であり、私はそのような統計技術に基づいた物全般を AI だとは認めていない。今の AI バブルは本当に人々が"それっぽい"ことに振り回されていること、“すべてが間違っているわけではなく、気づくことが困難な部分で間違っていたり問題を起こす"という境界値問題に対して、耐性がなかったりすることで成立しているところがあるのだということも改めて体験することになったように見受けられる。

 今回期待された LLM の挙動としては、最初に与えられた以下のログの部分を見て、PATH が正しく通っていないことについて指摘し、フォルダ名を修正するという修正案を提案することであったが、実際の LLM 利用においては、大きく的を外しておりそうはならなかった。別に期待しているわけではないが、ただでさえ的を外してくるくせに"自分は絶対に間違っていない"というプライドは高い出力で、ユーザをいじめてきて、なんていうか不完全で偏っていることを前提としていない出力しかできない LLM モデルなんて求めていないというか、ただひたすらにストレスだった。別に、出力内容が的を得ていて、確かに根本的に問題を修正するのならば、別にまあそんなものかと思うが、結果をともなわずに、主張の威勢だけの LLM モデルの出力というのは見ていて痛々しいものがある。

 useName on  ~/work/free/2026-08-18-07:40:50-1787006450 
# npm create vite@latest
Need to install the following packages:
create-vite@9.1.2
Ok to proceed? (y) y
npm notice run npx
npm notice run 'create-vite'
│
◇  Project name:
│  RSS-Listing
│
◇  Package name:
│  rss-listing
│
◇  Select a framework:
│  React
│
◇  Select a variant:
│  TypeScript
│
◇  Which linter to use?
│  Oxlint
│
◇  Install with npm and start now?
│  Yes
│
◇  Scaffolding project in /home/useName/work/free/2026-08-18-07:40:50-1787006450/RSS-Listing...
│
◇  Installing dependencies with npm...

added 27 packages, and audited 28 packages in 13s

9 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
│
◇  Starting dev server...
npm notice run rss-listing@0.0.0 dev
npm notice run vite
sh: 行 1: vite: command not found
npm error code 127
npm error path /home/useName/work/free/2026-08-18-07:40:50-1787006450
npm error command failed
npm error command sh -c 'create-vite'
npm error A complete log of this run can be found in: /home/useName/.npm/_logs/2026-08-17T22_41_19_007Z-debug-0.log
 useName on  ~/work/free/2026-08-18-07:40:50-1787006450 
# ls
⠀readme.md  ⠀RSS-Listing/
 useName on  ~/work/free/2026-08-18-07:40:50-1787006450 
# cd RSS-Listing/
 useName on  ~/work/free/2026-08-18-07:40:50-1787006450/RSS-Listing 
# ls
⠀index.html     ⠀package-lock.json  ⠀public/    ⠀src/               ⠀tsconfig.json       ⠀vite.config.ts
⠀node_modules/  ⠀package.json       ⠀README.md  ⠀tsconfig.app.json  ⠀tsconfig.node.json  
 useName on  ~/work/free/2026-08-18-07:40:50-1787006450/RSS-Listing 
# npm run devb
npm error Missing script: "devb"
npm error
npm error Did you mean this?
npm error   npm run dev # run the "dev" package script
npm error
npm error To see a list of scripts, run:
npm error   npm run
npm error A complete log of this run can be found in: /home/useName/.npm/_logs/2026-08-17T22_42_06_681Z-debug-0.log
 useName on  ~/work/free/2026-08-18-07:40:50-1787006450/RSS-Listing 
# npm run devb^?
npm error Missing script: "devb^?"
npm error
npm error To see a list of scripts, run:
npm error   npm run
npm error A complete log of this run can be found in: /home/useName/.npm/_logs/2026-08-17T22_42_07_809Z-debug-0.log
 useName on  ~/work/free/2026-08-18-07:40:50-1787006450/RSS-Listing 
# npm run dev
npm notice run rss-listing@0.0.0 dev
npm notice run vite
sh: 行 1: vite: command not found
 useName on  ~/work/free/2026-08-18-07:40:50-1787006450/RSS-Listing 
# conda deactivate
 useName on  ~/work/free/2026-08-18-07:40:50-1787006450/RSS-Listing 
# npm install

up to date, audited 28 packages in 537ms

9 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
 useName on  ~/work/free/2026-08-18-07:40:50-1787006450/RSS-Listing 
# npm run dev
npm notice run rss-listing@0.0.0 dev
npm notice run vite
sh: 行 1: vite: command not found
 useName on  ~/work/free/2026-08-18-07:40:50-1787006450/RSS-Listing 
# npx vite
npm notice run rss-listing@0.0.0 npx
npm notice run 'vite'
sh: 行 1: vite: command not found
npm warn run-script Path contains delimiter (":"), "npx" script may not behave as expected.

 ていうか今ブログを書くために LLM のセッションなどを見返していて思ったが、npx がnpm warn run-script Path contains delimiter (":"), "npx" script may not behave as expected.と教えてくれているのに、それは平気で無視する LLM モデルって本当に何がしたいんだろうって感じである。パッケージのインストールでは特にエラーが出たわけではないし、npm など Web 開発の文脈では複雑で大規模な依存関係は一つの依存関係が崩れるだけで全体が崩れてしまう問題から改善が進んだ結果として、インストールされるパッケージ数が少なくなったとも考えられるにもかかわらず、一度 LLMモデルにとっての"絶対的な確信の自説"が出てくるようになるとずっとこすり続けてくるため、もうそのセッションは駄目かもしれない。

使った画像とか

参考にしたサイトとか