skills/shuru/SKILL.md
Run commands in an isolated Linux microVM sandbox using the shuru CLI. Use when the user asks to execute untrusted code, install packages safely, test in a clean environment, or needs Linux-specific tooling on macOS.
npx skillsauth add superhq-ai/shuru shuruInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Shuru boots an ephemeral Linux microVM (Debian, ARM64) on macOS. Each shuru run gets a fresh disk clone - all changes are discarded on exit. Use it whenever you need to run commands in isolation from the host.
The pattern is: run in sandbox, mount to share files, checkpoint to persist state.
# 1. Run a command in a fresh VM
shuru run -- echo "hello from the sandbox"
# 2. Mount the project directory so the VM can access host files
shuru run --mount ./src:/workspace -- ls /workspace
# 3. If the command needs network access (install packages, fetch data)
shuru run --allow-net -- sh -c 'apt-get install -y curl && curl https://example.com'
# 4. If setup is expensive, save a checkpoint and reuse it
shuru checkpoint create node-env --allow-net -- apt-get install -y nodejs npm
shuru run --from node-env --mount .:/workspace -- node /workspace/app.js
Chain commands with sh -c when you need multiple steps:
shuru run --allow-net -- sh -c 'apt-get install -y python3 python3-pip && python3 -c "print(1+1)"'
shuru run --mount .:/workspace -- sh -c 'cd /workspace && ls -la && cat README.md'
shuru run [flags] [-- command...]
# Interactive shell (default when no command given)
shuru run
# Run a single command
shuru run -- whoami
# With resources
shuru run --cpus 4 --memory 4096 --disk-size 8192 -- make -j4
# With networking + port forwarding
shuru run --allow-net -p 8080:80 -- nginx -g 'daemon off;'
# Multiple mounts
shuru run --mount ./src:/src --mount ./data:/data -- ls /src /data
# From a checkpoint
shuru run --from myenv -- npm test
# Create: boots VM, runs command, saves disk on exit
shuru checkpoint create <name> [flags] [-- command...]
# Stack: create from an existing checkpoint
shuru checkpoint create with-deps --from base-env --allow-net -- npm install
# List all checkpoints (shows actual disk usage)
shuru checkpoint list
# Delete
shuru checkpoint delete <name>
Checkpoint names must be unique - delete the old one before re-creating with the same name.
# Download/update OS image
shuru init
shuru init --force # re-download even if up to date
# Upgrade CLI + OS image
shuru upgrade
# Clean up leftover data from crashed VMs
shuru prune
Create a checkpoint with all dependencies pre-installed, then use it for fast runs:
# One-time setup
shuru checkpoint create python-dev --allow-net -- sh -c 'apt-get install -y python3 python3-pip && pip install pytest requests'
# Fast subsequent runs
shuru run --from python-dev --mount .:/workspace -- sh -c 'cd /workspace && pytest'
Run untrusted scripts with no network access and no host filesystem access:
# Fully isolated — no --allow-net, no --mount
shuru run -- sh -c 'echo "malicious script here" && rm -rf / 2>/dev/null; echo "host is safe"'
Mount source, build inside the VM, results appear on host via the mount:
shuru run --mount .:/workspace --cpus 4 --memory 4096 -- sh -c '
cd /workspace
apt-get install -y build-essential
make -j4
make test
'
shuru run --allow-net --from node-env -p 3000:3000 --mount .:/app -- sh -c '
cd /app && node server.js
'
# Access at http://localhost:3000 on the host
Build environments incrementally:
shuru checkpoint create base --allow-net -- apt-get install -y build-essential git curl
shuru checkpoint create node --from base --allow-net -- apt-get install -y nodejs npm
shuru checkpoint create project --from node --allow-net --mount .:/app -- sh -c 'cd /app && npm install'
# Now "project" has OS deps + Node + node_modules baked in
shuru run --from project --mount .:/app -- sh -c 'cd /app && npm test'
Place shuru.json in the project root to avoid repeating flags:
{
"cpus": 2,
"memory": 2048,
"disk_size": 4096,
"allow_net": true,
"ports": ["8080:80"],
"mounts": ["./src:/workspace"],
"command": ["/bin/sh", "-c", "cd /workspace && sh"],
"secrets": {
"API_KEY": {
"from": "OPENAI_API_KEY",
"hosts": ["api.openai.com"]
}
},
"network": {
"allow": ["api.openai.com", "registry.npmjs.org"]
}
}
CLI flags override config values. When secrets are configured, the guest receives placeholder tokens and the proxy substitutes real values on HTTPS requests to allowed hosts. See references/config.md for all fields.
--allow-net to install packages or make HTTP requests.apt-get install for packages.:rw suffix + --allow-host-writes to write to the host.--cpus, --memory, --disk-size.development
Build landing pages and web UIs using a dark blueprint/wireframe aesthetic with sharp edges, connected sections, dashed outlines, measurement annotations, and technical typography. Use when creating marketing sites, landing pages, or product pages.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------