From lima-devbox
Guides macOS users through Lima VM setup for isolated dev environments, configuring name, resources, shared dirs, git, languages (Node.js, Go, Rust, Python), tools, AI agents, and ports.
npx claudepluginhub recodelabs/lima-devbox --plugin lima-devboxThis skill uses the workspace's default tool permissions.
This skill guides users through creating a Lima VM configured for development work on macOS.
Provides step-by-step setup guides for developer environments on Windows, macOS, Linux, and WSL. Covers package managers, shells, VS Code, Docker, AI tools, databases, and security for new machine setups or team onboarding.
Create, start, stop, restart, or SSH into a headless Windows 11 VM running in Docker with KVM acceleration. Use for Windows tasks on Linux hosts without GUI.
Manages persistent VMs on exe.dev: create/list VMs, configure HTTP proxies/ports, share access/links/users, set custom domains. Use for hosting, dev environments, persistent services.
Share bugs, ideas, or general feedback.
This skill guides users through creating a Lima VM configured for development work on macOS.
brew install lima)Use AskUserQuestion to gather configuration. Ask these in sequence:
Question 1: VM Name
limactl shell <name>)Question 2: Resources
Question 3: Shared Directories
Question 3b: Ask for the directory path(s)
Question 4: Git Configuration Ask for git user.name and user.email (can use AskUserQuestion with text input)
Question 5: Languages
Question 6: Tools
Question 6b: AI Coding Agents
Question 7: SSH Password (Optional)
Question 7b (if password selected): Ask user to enter their desired password
Question 8: Port Forwarding
Question 9: SSH Agent Forwarding
Question 10: VM Type
Question 11: Rosetta (Apple Silicon only)
After gathering configuration, create a todo list and execute each step:
limactl --version
If not installed, install it:
brew install lima
limactl start --name=<vm_name> --cpus=<cpus> --memory=<memory> --disk=<disk> -y
Wait for VM to be running:
limactl list --json | jq -r '.[] | select(.name=="<vm_name>") | .status'
Edit ~/.lima/<vm_name>/lima.yaml to apply user's configuration choices:
VM Type (if user selected vz):
vmType: "vz"
Rosetta (if enabled, requires vmType: vz):
rosetta:
enabled: true
SSH Agent Forwarding (if enabled):
ssh:
forwardAgent: true
Port Forwarding (for each selected port):
portForwards:
- guestPort: 8080
hostPort: 8080
- guestPort: 3000
hostPort: 3000
Mounts - configure ONLY the shared directories (no home directory access):
Find the mounts: section and replace it with:
mounts:
- location: "<writable_path>"
writable: true
For multiple directories:
mounts:
- location: "~/github"
writable: true
- location: "~/projects"
writable: true
IMPORTANT: Do NOT include a location: "~" mount. Only the specified directories should be accessible.
IMPORTANT: Mount configuration changes (especially writable: true) require a full stop/start cycle to take effect. A simple limactl restart is NOT sufficient - you must explicitly stop and then start the VM.
limactl stop <vm_name>
limactl start <vm_name>
After restarting, verify the mount is writable by checking the mount flags:
limactl shell <vm_name> -- mount | grep <mount_path>
The output should show rw (read-write), not ro (read-only):
mount0 on /path/to/mount type virtiofs (rw,relatime)
If it still shows ro, stop and start again.
mkdir -p ~/.ssh/config.d
ln -sf ~/.lima/<vm_name>/ssh.config ~/.ssh/config.d/<vm_name>
Ensure ~/.ssh/config includes:
Include config.d/*
After this, user can SSH with: ssh <vm_name>
SSH Authentication Note: Lima uses key-based authentication by default:
~/.lima/_config/userCopy and execute scripts/setup-vm.sh in the VM:
limactl shell <vm_name> -- bash -c "$(cat <skill_path>/scripts/setup-vm.sh)" -- "<git_name>" "<git_email>" "<working_dir>"
Where <working_dir> is the first (or primary) mounted directory path. This will be the default directory when the user shells into the VM.
This installs system packages, configures git, sets up .bash_profile for SSH sessions, and configures the shell to start in the shared directory.
If user chose to set a password:
limactl shell <vm_name> -- bash -c "echo '<username>:<password>' | sudo chpasswd"
Where <username> is the user's macOS username (same as VM user).
limactl shell <vm_name> -- bash -c "$(cat <skill_path>/scripts/install-mise.sh)" -- <languages>
Where <languages> is a space-separated list like nodejs go rust python.
For GitHub CLI:
limactl shell <vm_name> -- bash -c "$(cat <skill_path>/scripts/install-gh.sh)"
For Docker (if user specifically wants Docker instead of nerdctl):
limactl shell <vm_name> -- bash -c "curl -fsSL https://get.docker.com | sh && sudo usermod -aG docker \$USER"
Note: nerdctl is already available (nerdctl run, nerdctl build, etc.) and is docker-compatible. Most users won't need Docker.
For Claude Code:
limactl shell <vm_name> -- bash -c "$(cat <skill_path>/scripts/install-ai-agent.sh)" -- claude
For Gemini CLI:
limactl shell <vm_name> -- bash -c "$(cat <skill_path>/scripts/install-ai-agent.sh)" -- gemini
For Codex CLI:
limactl shell <vm_name> -- bash -c "$(cat <skill_path>/scripts/install-ai-agent.sh)" -- codex
For OpenCode:
limactl shell <vm_name> -- bash -c "$(cat <skill_path>/scripts/install-ai-agent.sh)" -- opencode
All agents are configured with aliases for autonomous/YOLO mode operation.
limactl shell <vm_name> -- bash -c "echo 'VM is ready!' && git --version && mise --version"
Stop and restart the VM to ensure shared directory permissions are properly applied:
limactl stop <vm_name>
limactl start <vm_name>
Wait for the VM to be running before presenting the summary to the user.
After successful setup, provide the user with:
Access commands:
limactl shell <vm_name> - Interactive shell (starts in shared directory)ssh <vm_name> - SSH access (if config symlink created)exit or Ctrl+D - Exit the VM shell and return to Mac terminalCommon Lima commands:
limactl stop <vm_name> - Stop the VMlimactl start <vm_name> - Start the VMlimactl restart <vm_name> - Restart the VMlimactl delete <vm_name> -f - Delete the VMWorking with files:
~/github) are accessible from the VMContainer tools:
nerdctl is pre-installed (docker-compatible commands)nerdctl run -it ubuntu bashPort forwarding (if configured):
localhost:<port> on your Maclocalhost:8080SSH agent (if enabled):
Reference: Point to references/lima-commands.md for full command reference
Scripts are located in scripts/ relative to this skill:
setup-vm.sh - Base system setup (packages, git config, bash_profile, default working directory)install-mise.sh - Mise installation and language setupinstall-gh.sh - GitHub CLI installationinstall-ai-agent.sh - AI coding agent installation (Claude Code, Gemini CLI, Codex CLI, OpenCode)brew install limalimactl logs <vm_name>limactl stop followed by limactl start (not just restart). Verify with mount | grep <path> - look for rw not ro