SKILL.md
Setup Context Skill
Configure the .env file for managing VMs on a hypervisor.
Instructions
Step 1: Ask for Backend Type
Use AskUserQuestion to ask which backend:
- libvirt - Local QEMU/KVM via libvirt
- proxmox - Remote Proxmox VE server via SSH (KVM VMs)
- proxmox-lxc - Remote Proxmox VE server via SSH (LXC containers; mutable-only, supports host ZFS bind mounts and the
nasprofile)
Step 2: Gather Backend-Specific Settings
For libvirt backend:
Most users can accept defaults. Only ask about non-default settings if user indicates special requirements (like running from a container).
Create .env with just:
BACKEND=libvirt
For proxmox backend:
Ask the user (as plain text prompts, not multiple choice):
- PVE_HOST (required) - SSH config host name (e.g.,
pve) or hostname/IP - PVE_STORAGE - Storage for VM disks (default: local)
- PVE_BRIDGE - Network bridge (default: vmbr0)
Explain that they should configure their SSH connection in ~/.ssh/config:
Host pve
HostName 192.168.1.100
User root
Port 22
And use ssh-agent for key authentication:
eval $(ssh-agent)
ssh-add ~/.ssh/id_ed25519
For proxmox-lxc backend:
Same SSH setup as proxmox. Ask the user (plain text prompts):
- PVE_HOST (required) - SSH config host name (e.g.,
pve) or hostname/IP - PVE_STORAGE - CT-capable rootfs storage (a
zfspoolordirstorage, e.g.local-zfsor a pool name likerust; NOT a bare ZFS pool path). Check withssh <host> pvesm status. - PVE_BRIDGE - Network bridge (default: vmbr0)
Notes specific to this backend:
- LXC is mutable-only (read-write rootfs;
nixos-rebuildruns inside). There is no immutable/semi-mutable mode. - The
nasprofile (NFS + Samba) is LXC-only and runs the container privileged with an apparmor-unconfined override (for kernel NFS). - Host ZFS datasets are bind-mounted into the container (
<dataset>:<container-path>, e.g.rust/nas:/srv/nas); a bare dataset name is created on the host if missing. Configure these in the create wizard.
Example .env:
BACKEND=proxmox-lxc
PVE_HOST=pve
PVE_STORAGE=local-zfs
PVE_BRIDGE=vmbr0
PVE_BACKUP_STORAGE=local
Step 3: Create the .env file
Create/overwrite the .env file at the project root.
Example .env for libvirt:
BACKEND=libvirt
Example .env for proxmox:
BACKEND=proxmox
PVE_HOST=pve
PVE_STORAGE=local-lvm
PVE_BRIDGE=vmbr0
PVE_BACKUP_STORAGE=local
Step 4: Test Connection
After creating the .env file, run the connection test:
just test-connection
Important: Warn the user that they may need to authenticate multiple times during the test (SSH key passphrase prompts if not using ssh-agent, or host key verification).
If the test passes, tell the user the setup is complete and they can now use just commands.
Variable Reference
Libvirt Variables
| Variable | Default | Description |
|---|---|---|
BACKEND |
libvirt |
Set to libvirt |
LIBVIRT_URI |
qemu:///system |
Libvirt connection URI |
HOST_CMD |
(empty) | Prefix for host commands (e.g., host-spawn for distrobox) |
Proxmox Variables
| Variable | Default | Description |
|---|---|---|
BACKEND |
- | Set to proxmox |
PVE_HOST |
(required) | SSH config host name (or hostname/IP) |
PVE_NODE |
$PVE_HOST |
Proxmox node name (for clusters) |
PVE_STORAGE |
local |
Proxmox storage for VM disks |
PVE_BRIDGE |
vmbr0 |
Network bridge name |
PVEDISKFORMAT |
qcow2 |
Disk format (qcow2, raw, vmdk) |
PVEBACKUPSTORAGE |
local |
Proxmox storage for backups |
Proxmox-LXC Variables
| Variable | Default | Description |
|---|---|---|
BACKEND |
- | Set to proxmox-lxc |
PVE_HOST |
(required) | SSH config host name (or hostname/IP) |
PVE_NODE |
$PVE_HOST |
Proxmox node name (for clusters) |
PVE_STORAGE |
local |
CT-capable rootfs storage (zfspool/dir; NOT a bare pool path) |
PVE_BRIDGE |
vmbr0 |
Network bridge name |
PVEBACKUPSTORAGE |
local |
Proxmox storage for backups |
PVETEMPLATEDIR |
/var/lib/vz/template/cache |
Where the LXC template tarball is staged |
LXC_FEATURES |
nesting=1 |
pct create --features value |