duoコマンド

同じエンジンをコマンドラインツールとして。そして、決して中途半端にはしない2つのこと。

← すべてのドキュメント

同じエンジンにコマンドラインが用意されています。duo は本物の DuoUpdaterCore にリンクしているため、メニューバーと同じ更新元を同じ順序で使い、同じインストールポリシー、同じ無視・スキップのルールに従います —— 両者の答えが食い違えば、それは意見の相違ではなくバグです。

make cli          # → ~/.local/libexec/duo、~/.local/bin/duo にシンボリックリンク

duo list                     # ネットワークに触れずに、何がインストールされているか
duo check --json             # 更新があるものを、1行1つのJSONオブジェクトで
duo install Cursor           # 1つを適用、または --all
duo doctor                   # このマシンが実際に何かをインストールできる状態かどうか
duo backups                  # ロールバックポイントの一覧表示、または元に戻す

duo check と duo list は --source sparkle,github,… と --include-hidden も受け付けます。duo ignore と duo skip はアプリが読むのと同じ設定を書き込むので、片方で何かを隠せばもう片方でも隠れます。

中途半端にはせず拒否する2つのこと

App Storeのアップデート。 そのルートには、権限を持つヘルパー(SMAppService の登録にはアプリバンドルが必要)か、App Store.appをAccessibility APIで操作するかのどちらかが必要です。コマンドラインツールにはそのどちらもないため、途中まで進めて失敗する代わりに、その旨をそのまま伝えます。

インストールロックを強引に奪うこと。 メニューバーアプリがインストールの最中であれば、duo はその保持者の名前を示して終了し、その足元でバンドルを入れ替えることはしません。

メンテナンス側

duo verify、duo triage、duo reconcile は、手作業で書かれたすべてのレシピをその実際のエンドポイントに対して確認し、壊れたレシピについてはモデルにその原因を尋ね、結果をissueへと変換します。これは夜間チェックが実行しているものです。通常の利用には不要です。