vm-lab
Parallels macOS VM lab: GUI automation, Peekaboo, TCC, Ghostty.
Skill by steipete
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/steipete-vm-lab
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/vm-lab
What's inside
- Skill name
vm-lab- Description
- Parallels macOS VM lab: GUI automation, Peekaboo, TCC, Ghostty.
- License
- MIT
- Instructions
- 179 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
Files (4)
- SKILL.md
- openai.yaml · agents/
- bootstrap-diagnostics.md · references/
- parallels_type.py · scripts/
SKILL.md (first lines)
# VM Lab Use this when the task needs a clean macOS VM to test GUI automation, TCC prompts, screenshot capture, clicking, typing, performance, or "two-way validation" of Peekaboo-like tools. Core idea: run the tool under test inside the guest, but verify it from outside the guest with Parallels screenshots and host-side observations. Do not close apps you do not own. ## Safety Rules - Only task-owned clones are disposable. Preserve source/golden snapshots, recovery VMs, and other tasks' VMs; never reset, revert, or delete their snapshots. - Never access inherited guest credentials or bypass login/startup security to bootstrap a clone. - Never print secrets. If `op` is needed, follow the 1Password skill and run it only inside `tmux`. - Prefer fresh app windows you create yourself: TextEdit, a local HTML test page, or a small test app. - Limit host writes to task-owned temporary diagnostics and explicitly authorized clone recovery. Never change global Bash/Codex settings for a lab workaround. - For git repos inside the VM, use HTTPS remotes and normal branch discipline. ## Bootstrap Preflight Before guest automation, confirm the exact task-owned VM UUID and snapshot provenance; the names below are examples, not permission to operate an existing VM. - Apple-VZ clone fails to boot: verify the active raw disk's contents, not just clone success or logical size. A sparse linked child alone does not prove a broken chain; `clone --unlink` creates another clone, not an in-place repair. - Packaging hangs before its first output: inspect the task-owned shell process and heredoc redirection before changing product code or build guards. A system-Bash retry must also pin PATH-resolved child shells, for that invocation only. Use [Bootstrap diagnostics](references/bootstrap-diagnostics.md) for read-only checks, evidence limits, and narrowly scoped recovery boundaries. ## VM Discovery List VMs: ```bash prlctl list --all ``` Get VM status/IP: ```bash prlctl list --info "macOS Tahoe" ``` Run guest commands as Peter: ```bash prlctl exec "macOS Tahoe" \ 'sudo -u steipete -H /bin/zsh -lc '\''source ~/.zprofile 2>/dev/null || true; uname -a'\''' ``` Capture an independent host-side screenshot: ```bash prlctl capture "macOS Tahoe" --file /tmp/vm-reference.png sips -g pixelWidth -g pixelHeight /tmp/vm-reference.png ``` ## TCC / GUI Attribution For macOS Screen Recording and Accessibility, the responsible process matters. - `prlctl exec` is headless and can fail to produce useful Screen Recording attribution. - Launch the test command from a visible terminal app in the guest when Screen Recording is involved. - Ghostty works as a GUI terminal if installed. - After a first failed capture, check `System Settings > Privacy & Security > Screen & System Audio Recording`. - `permissions status` run through `prlctl exec` may still report Screen Recording false after Ghostty is allowed; validate Screen Recording by rerunning the capture from Ghostty. Open the Screen Recording pane: ```bash prlctl exec "macOS Tahoe" \ 'sudo -u steipete -H open "x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture"' ``` Open Ghostty: ```bash prlctl exec "macOS Tahoe" 'sudo -u steipete -H open -a Ghostty' ``` ## Running Commands Through Ghostty Best path: create a guest script with `prlctl exec`, open/focus Ghostty, then type only a short launcher path into the visible terminal. Guest script pattern: ```bash prlctl exec "macOS Tahoe" 'sudo -u steipete -H /bin/zsh -lc '\''cat > /tmp/run-vm-lab.zsh <<EOF #!/bin/zsh source ~/.zprofile 2>/dev/null || true cd ~/Projects/Peekaboo || exit 1 Apps/CLI/.build/debug/peekaboo image --path /tmp/peekaboo-vm.png --json rc=$? echo "EXIT:$rc" [ -f /tmp/peekaboo-vm.png ] && sips -g pixelWidth -g pixelHeight /tmp/peekaboo-vm.png echo "Press return to close..." read _ exit $rc EOF chmod +x /tmp/run-vm-lab.zsh ln -sf /tmp/run-vm-lab.zsh /tmp/r open -a Ghostty'\''' ``` Then link the launcher into Ghostty's home directory and type `./r` with `scripts/parallels_type.py`. This avoids unreliable path characters in Parallels key injection. ```bash prlctl exec "macOS Tahoe" \ "sudo -u steipete -H /bin/zsh -lc 'ln -sf /tmp/run-vm-lab.zsh ~/r'" python3 skills/vm-lab/scripts/parallels_type.py "macOS Tahoe" $'./r\n' ``` Avoid long command typing. Parallels key injection uses its own key-code table and can be layout-sensitive. ## Known Pitfalls - macOS clipboard APIs may fail from `prlctl exec`; `pbcopy`, AppleScript clipboard, and Peekaboo paste can all fail in headless guest context. - `open -na Ghostty.app --args -e ...` may only focus an existing Ghostty window on macOS; do not assume it runs the command. - `prlctl exec` may re-join argv through a guest shell; for complex payloads, pass one fully shell-quoted command string or create the file with a tiny Python writer. - Parallels `send-key-event --key` uses Parallels key values, not macOS virtual key codes. - For normal typing, send `prlctl send-key-event <vm> --key <key>` with no `--event`; explicit `press`/`release` can repeat or stick. Return is an exception: use press then release. - Prefer one `prlctl send-key-event --json` batch over many separate `send-key-event` processes; separate calls can drift under focus/latency. - Use `PRL_KEY_ENTER = 36`, `PRL_KEY_SLASH = 61`, `PRL_KEY_R = 27`, `PRL_KEY_T = 28`, `PRL_KEY_M = 58`, `PRL_KEY_P = 33`. - If keystrokes produce garbage, send Return to clear the line, create a shorter launcher, then retry.
From steipete/agent-scripts, MIT.
More from steipete/agent-scripts
- 0.843score
codex-first
steipete
Claude Code work routing: delegate hands-on work to Codex under the native-Claude model gate.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.843score
fleet-maintenance
steipete
Mac fleet inventory and upkeep with full/worker profiles: collect installed apps and packages, compare desired versus observed state, audit local-account…
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.840score
project-structure
steipete
Generate a single-file compressed symbol map of a TypeScript or Swift repository — files, exported symbols, typed signatures, plugin boundaries — sized to fit…
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.839score
video-transcript-downloader
steipete
yt-dlp downloads: video, audio, subtitles, transcripts, clips, playlists.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.839score
nano-banana-pro
steipete
Nano Banana/Gemini image gen/edit: text/image input, 512-4K workflows.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.839score
openclaw-relay
steipete
OpenClaw session relay: prompts/posts via local/remote acpx over SSH.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.838score
codex-huge-context
steipete
Codex 1M context: direct OpenAI Responses API inference, safe Astra/Sol/Terra/Luna input headroom, Keychain delivery, and Mac fleet rollout.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.835score
release-mac-app
steipete
macOS app release: Sparkle, notarization, GitHub Release, Homebrew, closeout.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.835score
npm
steipete
npm registry ops: login, whoami, names, publish; 1Password tmux.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.834score
markdown-converter
steipete
Markdown conversion: PDF, Office, HTML, data, OCR, audio, ZIP, YouTube.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.829score
remote-mac
steipete
Remote Macs: MacBooks, Mac Studios, hosted claw Macs, Tailscale, SSH, and OpenClaw.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.797score
maintainer-orchestrator
steipete
Coordinate multiple maintainer issues, PRs, or repositories with bounded workers, serialized public actions, and clear owner decisions.
SkillBFreshness: B★ 7.4KClaude Code +9
Signals
- Stars
- 7,401
- Forks
- 646
- Open issues
- 0
- Last commit (this folder)
- Sep 6, 2026 (1 month ago)
- Last release
- Jul 17, 2026 (3 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/steipete/agent-scripts
- Website
- steipete.me
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from steipete
- 0.843score
fleet-maintenance
steipete
Mac fleet inventory and upkeep with full/worker profiles: collect installed apps and packages, compare desired versus observed state, audit local-account…
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.843score
codex-first
steipete
Claude Code work routing: delegate hands-on work to Codex under the native-Claude model gate.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.840score
project-structure
steipete
Generate a single-file compressed symbol map of a TypeScript or Swift repository — files, exported symbols, typed signatures, plugin boundaries — sized to fit…
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.839score
video-transcript-downloader
steipete
yt-dlp downloads: video, audio, subtitles, transcripts, clips, playlists.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.839score
openclaw-relay
steipete
OpenClaw session relay: prompts/posts via local/remote acpx over SSH.
SkillAFreshness: A★ 7.4KClaude Code +9 - 0.839score
nano-banana-pro
steipete
Nano Banana/Gemini image gen/edit: text/image input, 512-4K workflows.
SkillAFreshness: A★ 7.4KClaude Code +9
Cite this page
vm-lab skill. Agent Mart. https://agentmart.dev/skills/steipete-vm-lab (last updated 2026-10-24)