Use an environment
- Select a local Git project in Add agent and choose Use a VM · Pro.
- Choose a recipe, name the environment, and select Prepare environment. Review the scripts first: they run with your local credentials and can create resources billed by your provider.
- When it is running, choose Continue in this environment. Confirm the SSH host key, then choose the branch and create the remote worktree as usual.
- Manage Suspend, Resume, and Destroy in Settings → VM environments.
Try a local VM with Lima
Install Lima 1.2 or later, Git, and Python 3. Download the Lima recipe into your project at.dure/lima.sh and its manifest at
dure.environments.json in the project root.
The example uses an Ubuntu 24.04 VM with 2 CPUs, 2 GiB memory, and a 12 GiB disk.
It copies the currently committed HEAD into /home/dure/project; uncommitted
changes, ignored files, and credentials are not included. It mounts no host
directories. Install your agent CLI and sign in inside the VM before starting
agent work.
Lima supplies the SSH endpoint and key.
The recipe pins a loopback port so restarting retains the same connection.
On supported Macs, Lima uses Apple virtualization.
Private provisioning logs are written beside LIMA_HOME in a sibling directory
named <LIMA_HOME directory name>-dure-logs. Default: ~/.lima-dure-logs.
Recipe contract
Createdure.environments.json at your project root:
create and destroy are required. suspend and resume must both be present
or both omitted. Paths must resolve to files inside the project. Each script
must be UTF-8 and at most 64 KiB; a manifest can contain up to 32 recipes.
The JSON-encoded captured scripts for one recipe must fit within 256 KiB.
Scripts execute through Bash in a private, persistent working directory for
that environment. Use DURE_PROJECT_PATH to read the source repository.
Dure captures the selected script contents and their digest before creation.
Changing a script after selecting it requires reloading the recipe. Later
lifecycle operations use the captured script, including after the project has
been deleted. Make cleanup self-contained; helper files in the source project
are not snapshotted.
Each invocation receives these environment variables:
Stdin contains one JSON object with
schemaVersion, action, instanceId,
name, projectPath, and recipeResult (the last successful result or null).
Ambient Dure, Hmux, and Git routing variables are excluded. Other inherited
environment variables are available to your provider CLI.
Run provisioning to completion in the foreground. The bounded child inherits
an operation lock; a daemon that keeps that descriptor open prevents subsequent
lifecycle operations until it releases it.
Successful create and resume must print exactly one JSON result to stdout:
keyPath is optional; omitting it uses normal SSH agent/config resolution.
The guest project root must already exist. userData is an optional object
retained privately for later commands; it is not returned to clients.
Resume must return the same resource ID and connection fields. Use a stable
address/port or DNS name for cloud VMs.
Successful suspend and destroy exit with status zero. All commands have a
30-minute limit and bounded 64 KiB output. Keep detailed logs in private files.
Dure exposes error codes without provider output.
Recovery and ownership
The record is persisted before provisioning. A failed or malformed create runs the captured destroy script automatically. Your provider must label/name resources usingDURE_ENVIRONMENT_ID, and destroy must be idempotent even
when recipeResult is null or the resource is already absent.
A backend interruption leaves a retained failed record. Refresh settings, then
destroy it to reconcile provider resources; Dure does not replay creation.
Cleanup failures remain visible for retry. Repeated requests with the same
creation key do not create another environment. Up to 512 records are retained
per local backend; destroyed records preserve retry identity.
CLI
list to observe completion. Preserve the returned
requestId when retrying after a lost acknowledgement. Read the latest revision
before a lifecycle change.