メインコンテンツへスキップ
Dure は、リポジトリ内のレシピを使って worktree 用の独立した VM やコンテナーを準備できます。レシピをローカルで実行して SSH エンドポイントを登録し、その環境内で通常のリモートプロジェクトとエージェントのワークフローを使います。 VM 環境には Beta インターフェースが必要です。設定 → 一般 → インターフェースモードでベータを選択してください。Basic でも既存環境の一時停止と削除はできますが、作成と再開はできません。

環境を使う

  1. エージェントを追加でローカル Git プロジェクトを選び、VM を使用 · Betaを選択します。
  2. レシピを選んで環境に名前を付け、環境を準備を選択します。先にスクリプトを確認してください。スクリプトはローカルの認証情報で実行され、プロバイダーの課金対象となるリソースを作成する場合があります。
  3. 実行中になったらこの環境で続けるを選択します。SSH ホストキーを確認し、通常どおりブランチを選んでリモート worktree を作成します。
  4. 設定 → VM 環境で一時停止、再開、削除を管理します。
ダイアログを閉じても準備は続きます。設定から実行中の環境を開くと、SSH 登録やエージェント起動の失敗から復旧できます。エージェントを削除したりペインを閉じたりしても、環境は削除されません。残したい作業を保存またはプッシュしてから、明示的に削除を使ってください。一時停止するとセッションは切断され、削除するとゲストのファイルがすべて失われる可能性があります。Dure は実行中のプロセスを移行せず、プロバイダーのログイン認証情報を VM にコピーしません。

Lima でローカル VM を試す

Lima 1.2 以降、Git、Python 3 をインストールします。Lima レシピをプロジェクトの .dure/lima.sh に、そのマニフェストをプロジェクトルートの dure.environments.json に保存します。プロジェクトルートで次を実行します。
Dure はレシピを Bash で実行するため、スクリプトに実行権限は必要ありません。プロジェクトにすでに dure.environments.json がある場合は、ファイルを上書きせず、その environments リストに lima レシピを追加してください。 この例では、2 CPU、2 GiB メモリ、12 GiB ディスクの Ubuntu 24.04 VM を使います。現在コミット済みの HEAD を /home/dure/project にコピーします。未コミットの変更、無視されたファイル、認証情報は含まれません。ホストのディレクトリは一切マウントしません。エージェントの作業を始める前に、VM 内でエージェント CLI をインストールしてログインしてください。 Lima が SSH エンドポイントとキーを提供します。レシピはループバックポートを固定するため、再起動しても同じ接続が維持されます。対応する Mac では、Lima は Apple の仮想化を使います。非公開の準備ログは、LIMA_HOME と同じ階層にある <LIMA_HOME directory name>-dure-logs ディレクトリに書き込まれます。既定値: ~/.lima-dure-logs。

レシピの契約

プロジェクトルートに dure.environments.json を作成します。
create と destroy は必須です。suspend と resume は両方を指定するか、両方を省略します。パスはプロジェクト内のファイルに解決される必要があります。各スクリプトは UTF-8 で 64 KiB 以下にしてください。1 つのマニフェストには最大 32 個のレシピを含められます。1 つのレシピでキャプチャしたスクリプトは、JSON エンコード後に 256 KiB 以内に収める必要があります。 スクリプトは、その環境専用の非公開で永続的な作業ディレクトリで Bash により実行されます。ソースリポジトリは DURE_PROJECT_PATH から読み取ってください。Dure は作成前に、選択したスクリプトの内容とダイジェストをキャプチャします。選択後にスクリプトを変更した場合は、レシピを再読み込みする必要があります。以降のライフサイクル操作では、プロジェクトが削除された後もキャプチャしたスクリプトを使います。クリーンアップは自己完結させてください。ソースプロジェクト内の補助ファイルはスナップショットされません。 各呼び出しは次の環境変数を受け取ります。 Stdin には、schemaVersion、action、instanceId、name、projectPath、recipeResult(直前に成功した結果、または null)を含む JSON オブジェクトが 1 つ渡されます。Dure は、名前が DURE_、HMUX_、GIT_ で始まる継承変数をすべて削除してから、上記の変数を設定します。その他の継承された環境変数はプロバイダー CLI から利用できます。準備はフォアグラウンドで最後まで実行してください。制限付きの子プロセスは操作ロックを継承します。デーモンがそのディスクリプターを開いたままにすると、解放されるまで後続のライフサイクル操作を実行できません。 成功した create と resume は、stdout に JSON 結果をちょうど 1 つ出力する必要があります。
keyPath は省略可能で、省略すると通常の SSH agent/設定による解決を使います。ゲストのプロジェクトルートはあらかじめ存在している必要があります。userData は省略可能なオブジェクトで、後続のコマンドのために非公開で保持され、クライアントには返されません。再開時は同じリソース ID と接続フィールドを返す必要があります。クラウド VM では固定のアドレス/ポートまたは DNS 名を使ってください。 成功した suspend と destroy は終了ステータス 0 で終了します。すべてのコマンドには 30 分の制限があり、出力は 64 KiB までです。詳細なログは非公開のファイルに残してください。Dure はプロバイダーの出力を含めず、エラーコードだけを表示します。

復旧と所有権

レコードは準備の前に保存されます。作成が失敗した場合や結果の形式が不正な場合は、キャプチャした destroy スクリプトが自動的に実行されます。プロバイダーのリソースには DURE_ENVIRONMENT_ID を使ってラベルや名前を付ける必要があり、destroy は recipeResult が null の場合やリソースがすでに存在しない場合でも冪等でなければなりません。 バックエンドが中断すると、失敗したレコードが保持されます。設定を更新してからそのレコードを削除し、プロバイダーのリソースを整理してください。Dure は作成を再実行しません。クリーンアップの失敗は再試行できるよう表示され続けます。同じ作成キーで要求を繰り返しても、別の環境は作成されません。ローカルバックエンドごとに最大 512 件のレコードが保持され、削除済みのレコードも再試行用の識別情報を保持します。

CLI

コマンドはローカルバックエンドを対象とし、JSON を返します。作成は保留中のレコードの受け付けを返すだけなので、完了は list で確認してください。応答を受け取れずに再試行するときは、返された requestId をそのまま使ってください。ライフサイクルを変更する前に、最新の revision を読み取ってください。