Spin up a RunPod GPU pod interactively.
-
Check permissions: Read ~/.claude/settings.json and check that the permissions.allow array contains all of these:
Bash(python *)
Bash(ssh *)
Bash(scp *)
Bash(sleep *)
If any are missing, tell the user which ones are needed and ask (via AskUserQuestion) if you can add them. If they agree, read the current settings.json, add the missing entries to permissions.allow, and write it back. If they decline, warn that the command will require manual permission approvals and continue.
-
List available GPUs: Run ${CLAUDE_PLUGIN_ROOT}/scripts/runpod_ctl.py gpus and show the user the options.
-
Ask the user which GPU they want using AskUserQuestion. Offer 3-4 common GPU options from the list, plus a "CPU-only" option. Also ask how many GPUs (default 1).
-
Ask for docker image if not obvious. Default comes from config (~/.claude/zombuul.yaml or shipped defaults). Only ask if the user might want a different image.
-
Create the pod in the background (docker image defaults from config; disk/volume come from flags or config):
- GPU:
${CLAUDE_PLUGIN_ROOT}/scripts/runpod_ctl.py create --name <name> --gpu "<gpu_type_id>" --gpu-count <n>
- CPU:
${CLAUDE_PLUGIN_ROOT}/scripts/runpod_ctl.py create --name <name> --cpu
- Add
--image "<image>" only if the user specified a non-default image.
- Add
--install-claude if the caller passed --remote in $ARGUMENTS.
- Add
--disk-gb <N> if the caller passed --disk-gb in $ARGUMENTS; same for --volume-gb. Omit both flags to fall back to config defaults.
- Add
--extras <LIST> if the caller passed --extras in $ARGUMENTS; otherwise omit (defaults to auto server-side, which installs every declared group).
Use the pod name from $ARGUMENTS if provided, otherwise default to "research". The script auto-detects the repo URL and branch from the current working directory, creates the pod, waits for SSH, and SCPs pod_setup.sh. Claude Code credentials are only copied and installed when --install-claude is set.
-
Ask about provisioning: After getting the pod ID, IP, and port from the create output, ask the user via AskUserQuestion:
- "Provision pod" (Recommended) — waits for setup to complete, configures SSH alias, syncs .env
- "Raw pod" — just prints SSH info, no provisioning
If the user chooses Provision: invoke /zombuul:provision-pod with JSON arguments: {"pod_id": "<pod_id>", "pod_name": "<name>", "ip": "<ip>", "port": "<port>"}. The provision skill handles SSH config, wait-setup, and .env sync.
If the user chooses Raw pod: report to the user:
- SSH command:
ssh root@<ip> -p <port> -i <ssh_key from config>
- The setup script is running in the background on the pod (clones repo, installs deps). Check
/var/log/pod_setup.log on the pod for progress.
- If setup fails, don't debug individual steps — just re-run
pod_setup.sh: ssh runpod-<name> 'nohup bash /pod_setup.sh <repo_url> <branch> </dev/null > /var/log/pod_setup.log 2>&1 & disown'. It's idempotent (skips clone if repo exists).
- They can run
/zombuul:pause-runpod to pause the pod when done (GPU billing stops, disk preserved).
If anything went wrong this session that zombuul could plausibly have done better, follow ${CLAUDE_PLUGIN_ROOT}/REPORTING_BUGS.md before ending.