コンテンツにスキップ
AIOS
AIOS自己更新Windowsインストーラーリリースバグ修正

v5.4.1:Windows で「aios update」が壊れていた理由と、自己更新の修正

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 がインストールツリーを固定します:

  1. インストーラーの削除ステップが静かに失敗(-ErrorAction SilentlyContinue がエラーを飲み込む)。
  2. Move-Item がターゲットディレクトリの存在を確認し、新バージョンを <install>/aios/ にネスト。
  3. 更新後の再実行が scripts/aios.mjs を見つけられず、素の MODULE_NOT_FOUND でクラッシュし、半分置き換えられたインストールが残る。

これは「ツールが壊れた」ように見えて、実際は「自分が立っているディレクトリは削除できない」という Windows API のルール1本によるバグでした。

修正:3層

  1. 先に移動。 リリースインストーラーを実行する前に、アップデータは自身の作業ディレクトリをインストールツリーの外へ移動します(ensureWorkingDirectoryOutsideInstallTree)。置き換え対象のディレクトリを固定するものがなくなります。
  2. 明示的に検証。 aios-install.ps1 / aios-install.sh は旧ディレクトリが実際に削除されたかを確認し、失敗時は明確なメッセージ(「実行中の aios/node プロセスがファイルをロックしている可能性」)で停止します。ネストを続けません。
  3. 再実行をガード。 更新後のプロセスはエントリポイントの存在を確認し、置き換えに失敗した場合は具体的な修復メッセージを出力します。

アップデータはリリースインストーラーの更新にローカルの 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 は最も一般的なケース——インストールディレクトリ内からの更新——を、テスト済みの安全な経路にしました。