v5.4.1:Windows で「aios update」が壊れていた理由と、自己更新の修正¶
クイックアンサー: v5.4.1 は Windows 限定の自己更新失敗を修正しました。インストールツリー内から
aios updateを実行すると、プロセスの作業ディレクトリがインストーラーが削除すべきディレクトリを固定し、Windows は cwd に保持されたディレクトリを削除できないため、削除が静かに失敗し、新バージョンが<install>/aios/にネストされ、後続の更新がMODULE_NOT_FOUNDでクラッシュしていました。修正は、作業ディレクトリをインストールツリーの外へ移動し、インストーラーが旧ディレクトリの削除を検証し(ネストせず明示的に失敗)、再実行時に明確なエラーを出すという3層です。
バグ:Windows で自己更新がインストールを壊す可能性¶
リリースインストール(git ワークツリーなし)の aios update は、リリースインストーラーをその場で再実行します。Windows では、実行中プロセスの cwd であるディレクトリは削除できません。~/.rexcil/aios の中から update を実行すると——最も自然な操作ですが——プロセス cwd がインストールツリーを固定します:
- インストーラーの削除ステップが静かに失敗(
-ErrorAction SilentlyContinueがエラーを飲み込む)。 Move-Itemがターゲットディレクトリの存在を確認し、新バージョンを<install>/aios/にネスト。- 更新後の再実行が
scripts/aios.mjsを見つけられず、素のMODULE_NOT_FOUNDでクラッシュし、半分置き換えられたインストールが残る。
これは「ツールが壊れた」ように見えて、実際は「自分が立っているディレクトリは削除できない」という Windows API のルール1本によるバグでした。
修正:3層¶
- 先に移動。 リリースインストーラーを実行する前に、アップデータは自身の作業ディレクトリをインストールツリーの外へ移動します(
ensureWorkingDirectoryOutsideInstallTree)。置き換え対象のディレクトリを固定するものがなくなります。 - 明示的に検証。
aios-install.ps1/aios-install.shは旧ディレクトリが実際に削除されたかを確認し、失敗時は明確なメッセージ(「実行中の aios/node プロセスがファイルをロックしている可能性」)で停止します。ネストを続けません。 - 再実行をガード。 更新後のプロセスはエントリポイントの存在を確認し、置き換えに失敗した場合は具体的な修復メッセージを出力します。
アップデータはリリースインストーラーの更新にローカルの scripts/aios-install.ps1 を優先するため、防御的な修正が即座に反映されます。
あなたがすべきこと¶
- 5.4.0 以前で
aios update後にMODULE_NOT_FOUNDを見た場合:一度インストーラーを再実行してください(irm https://github.com/rexleimo/aios/releases/latest/download/aios-install.ps1 | iex)。以後のaios updateは安全です。 - 失敗した更新の残骸として
~/.rexcil/aios/aios/に奇妙なネストがある場合:削除(または再インストール)してください。
FAQ¶
非 Windows インストールは影響を受けますか?¶
いいえ。Unix シェルは同じように cwd を固定しないため、この失敗は Windows のディレクトリロック特有です。防御的チェックは全プラットフォームで動作します。
影響を受けるのは aios update だけですか?¶
リリースインストールのインプレース置き換えはすべて同じ経路を通ります。作業ディレクトリの移動はその経路全体に適用されます。
詳細はどこで見られますか?¶
変更履歴に v5.4.1 が記載されています。修正自体はリリース資産に含まれており、5.4.1 に上げれば更新は安全です。
自分のインストールを壊せる自己更新は、更新器がないより悪い。v5.4.1 は最も一般的なケース——インストールディレクトリ内からの更新——を、テスト済みの安全な経路にしました。