Skip to content

Guide · Agent skill

How to use the VM Lab for macOS GUI Testing agent skill

Updated · written with AI from the project's own documentation and checked against our catalogue data

The vm-lab skill teaches an AI agent to test macOS software that clicks, types and captures the screen, using a clean, disposable macOS virtual machine running in Parallels Desktop. It is written for developers and engineers who need to check GUI automation, screenshot tools, or macOS permission prompts without touching their own Mac. After this guide you will know what the skill changes about the agent's behaviour, how to install it, how to ask for it in plain language, and which safety limits to keep in place.

VM Lab for macOS GUI Testingsteipete/agent-scripts · MIT

Quick start

  1. 1Download and unzip the skill. Download the ZIP from this skill's page and unzip it into ~/.claude/skills/ for a personal install or into a project's .claude/skills/ folder for a project install.
  2. 2Prepare the VM and host. Confirm Parallels Desktop and prlctl are installed on the host, that your macOS guest VM and its user account exist, and that Python 3 is available on the host.
  3. 3Discover the target VM. Ask the agent to run prlctl list --all and prlctl list --info for your VM, and confirm the VM is one you own and have prepared for testing.
  4. 4Run the test from a visible terminal. For Screen Recording tests, have the agent create a launcher script in the guest, open Ghostty, and type the short launcher path using scripts/parallels_type.py.
  5. 5Verify with two independent signals. Compare the tool's own output, such as JSON or a screenshot file, with an external check like a prlctl capture. Report the VM name, the tested commit, permission state, and results.

What the vm-lab skill makes the agent do

An agent skill is a folder with instructions (a SKILL.md file, plus any supporting files) that an AI agent reads when a task matches the skill's description. This one covers macOS GUI testing in a Parallels VM. When a task needs a clean macOS guest to test GUI automation, TCC prompts, screenshot capture, clicking, typing, performance, or two-way validation of Peekaboo-like tools, the agent follows the skill's workflow.

The core idea is that the agent runs the tool under test inside the guest, then verifies the result from outside the guest using Parallels screenshots and host-side observations. The skill also tells the agent not to close apps it does not own.

  • Discover VMs and check their status with prlctl.
  • Run guest commands as the guest user, capture host-side screenshots, and compare image dimensions.
  • Launch tests from a visible Ghostty terminal when Screen Recording permission is involved.
  • Check each GUI action with two independent signals: the tool's own output and an external verifier.
  • Record performance with /usr/bin/time -p using repeated cold and warm runs.

Install the vm-lab skill in Claude

You can install the skill for a single project or for your user account. Download the ZIP from the skill's page on this site and unzip it. The skill folder must end up in the skills directory that Claude Code reads.

For a personal install, unzip into ~/.claude/skills/. For a single project, unzip into the project's .claude/skills/ folder. In the Claude apps you can instead upload the ZIP under Settings → Capabilities → Skills.

  • Personal install: place the skill folder in ~/.claude/skills/.
  • Project install: place the skill folder in the project's .claude/skills/ folder.
  • Claude apps: upload the ZIP under Settings → Capabilities → Skills.
  • The skill's files are agents/openai.yaml, references/bootstrap-diagnostics.md, scripts/parallels_type.py and SKILL.md.
python3 skills/vm-lab/scripts/parallels_type.py "macOS Tahoe" $'./r\n'

Check what you need before you start

The skill depends on a specific setup. Confirm each item before asking the agent to run a test, because the workflow fails without them. The examples in the skill use a VM named macOS Tahoe and a guest user account named steipete. Use your own VM name and account, and make sure the VM is one you own and have prepared for testing.

  • Parallels Desktop on the host, with the prlctl command-line tool available.
  • A macOS guest VM with a user account the skill refers to as steipete.
  • Python 3 on the host to run scripts/parallels_type.py.
  • Ghostty terminal installed in the guest. This is optional but recommended for Screen Recording attribution.
  • A Peekaboo source checkout in the guest for the baseline steps.
  • Optional: the 1Password CLI (op), only if secrets are needed, and only inside tmux as the skill's rules require.

Ask the agent for a VM test in plain language

You do not need special syntax. Describe the task and mention the VM, the tool, and what you want verified. The skill triggers when the task needs a clean macOS VM for GUI or permission testing. Be specific about the target so the agent knows which VM it is allowed to use.

Good requests name the VM, the behaviour under test, and the evidence you expect back. The agent will then pick the matching commands and verification steps from the skill.

  • Test whether Peekaboo's screenshot command works in the macOS Tahoe VM and compare its size with a prlctl capture.
  • Check the Screen Recording permission prompt for my screenshot tool in a clean macOS Tahoe guest.
  • Type into a controlled text field in the guest and confirm the value with the accessibility result and a host screenshot.
  • Run cold and warm timings of my macOS command-line tool inside the guest and keep the outputs in /tmp.

Run a basic workflow: discover, capture, verify

Start with discovery. List the VMs, then check the target's status and IP. Next, run a simple guest command as the guest user to confirm access. The skill runs guest commands through prlctl exec and wraps them in a login shell that sources ~/.zprofile when it exists.

For verification, take an independent host-side screenshot with prlctl capture and read its pixel dimensions with sips. The agent compares this with the tool-under-test output. For Screen Recording tests, the skill says to launch the command from Ghostty, not from prlctl exec, because headless execution can give unhelpful permission attribution.

  • List all VMs: prlctl list --all
  • Check status and IP for one VM: prlctl list --info "macOS Tahoe"
  • Capture a host-side reference image and read its size with sips.
prlctl capture "macOS Tahoe" --file /tmp/vm-reference.png

Handle macOS permissions and typing through Ghostty

When a test needs Screen Recording or Accessibility, the responsible process matters. If the first capture fails, open System Settings > Privacy & Security > Screen & System Audio Recording inside the guest, allow Ghostty, then rerun the capture from Ghostty. The skill notes that permissions status run through prlctl exec can still report Screen Recording as false after Ghostty is allowed, so validate with a real capture.

The preferred path is to write a small launcher script in the guest, open Ghostty, then type only a short path such as ./r into the visible terminal. Typing long commands is error-prone because Parallels key injection uses its own key-code table and can depend on keyboard layout.

  • Open the Screen Recording pane in the guest with the open command shown in the skill.
  • Link the launcher into the guest user's home folder, then type ./r with scripts/parallels_type.py.
  • If keystrokes produce garbage, send Return to clear the line, create a shorter launcher, and retry.
python3 skills/vm-lab/scripts/parallels_type.py "macOS Tahoe" $'./r\n'

What people use it for

  • Checking that a macOS screenshot tool returns an image whose size and content match an independent prlctl capture.
  • Confirming that a macOS app shows the correct Screen Recording or Accessibility prompt in a clean guest.
  • Testing that a click on a test button in a controlled app changes the app state, verified by both the accessibility result and a host screenshot.
  • Measuring cold and warm run times of a macOS command-line tool inside a guest with /usr/bin/time -p and saved outputs.

Frequently asked questions

Is the vm-lab skill free to use?

The skill is published under the MIT licence, according to its listing on this page. Parallels Desktop is a separate product, and the skill assumes you already have it installed and a macOS guest VM prepared.

What do I need before I can use the vm-lab skill?

You need Parallels Desktop with the prlctl command-line tool on the host, a macOS guest VM, a guest user account the skill refers to as steipete, and Python 3 on the host. Ghostty in the guest is optional but recommended for Screen Recording tests.

Where do I put the vm-lab skill folder?

Unzip the downloaded ZIP into ~/.claude/skills/ for a personal install or into a project's .claude/skills/ folder for one project. In the Claude apps, you can upload the ZIP under Settings → Capabilities → Skills.

Does the vm-lab skill use the network?

The listing says it does not use the network. It does run scripts, including scripts/parallels_type.py, which types keystrokes into a live guest VM, so only use it on VMs you own and can reset.

Why does my Screen Recording check fail when I run it through prlctl exec?

The skill says prlctl exec is headless and can fail to give useful Screen Recording attribution. Allow Ghostty under Privacy & Security > Screen & System Audio Recording, then rerun the capture from a Ghostty window in the guest.

How does vm-lab compare with running tests on my own Mac?

The skill exists to keep tests in a clean, disposable macOS VM and to verify results from outside the guest. It is not suited to production machines, Windows or Linux VMs, or teams without Parallels and a prepared macOS guest.

New agent skills, repos and AI tools — every week

The best new skills and open-source projects, the fastest-growing repos, and one free prompt. Five minutes to read. Unsubscribe anytime.

Our verdict

Use the vm-lab skill if you build or test macOS GUI automation, screenshot or permission-dependent tools, and you already run Parallels with a prepared macOS guest you can safely reset. Pick a different approach if you lack Parallels or a dedicated VM, need Windows or Linux guests, or want an agent to work on machines and VMs you do not own.

Download the skill