merge-release
Automates the full release workflow: PR creation, merge, tagging, changelog update, and GitHub release.
Set up rr for a project - creates configs, verifies SSH connectivity, tests remote execution, and ensures dependencies are available on remote hosts.
> /plugin marketplace add rileyhilliard/rr > /plugin install rr@rr
How it fires
How this command gets triggered: by you, by Claude, or both.
/setupContext preview
What this command does when you run it.
Set up rr for a project - creates configs, verifies SSH connectivity, tests remote execution, and ensures dependencies are available on remote hosts.
name: rr:setup
description: Set up rr for a project - creates configs, verifies SSH connectivity, tests remote execution, and ensures dependencies are available on remote hosts.
allowed-tools:
- Bash
- Read
- Edit
- Write
- Grep
- Glob
load-skills:
- rrUse the `rr` skill
Set up and verify rr for this project. Work through each step in order, fixing issues as they arise.
Check if `~/.rr/config.yaml` exists with valid hosts:
cat ~/.rr/config.yaml
If missing or empty, ask the user for their remote machine details and help create the config. Refer to the rr skill for config format.
Detect the project's tech stack by checking for `package.json`, `go.mod`, `pyproject.toml`, `Makefile`, `Cargo.toml`, etc.
Create or update `.rr.yaml` with:
Refer to the rr skill for config format and task syntax.
Run diagnostics:
rr doctor
If SSH fails, debug systematically:
1. Test manual SSH: `ssh <host-alias>` 2. Check SSH config: `grep -A5 "<host-alias>" ~/.ssh/config` 3. Common fixes:
**Important for passphrase-protected keys:** Ensure your SSH config includes `AddKeysToAgent yes` and `UseKeychain yes` (macOS) so keys are automatically loaded:
Host your-host
HostName 192.168.x.x
User youruser
IdentityFile ~/.ssh/id_rsa
AddKeysToAgent yes
UseKeychain yesThis prevents "handshake failed" errors where `ssh` works but rr cannot connect.
Verify basic execution works:
rr exec "pwd"
Then test with sync:
rr run "ls -la"
If the remote directory is wrong, check the `dir` setting in global config.
rr supports declarative requirements via the `require:` field. Add required tools to `.rr.yaml`:
# .rr.yaml require: - go # Go projects - node # Node projects - python3 # Python projects - uv # Python package manager
Then verify requirements with doctor:
rr doctor --requirements
**If tools are missing**, rr shows which ones and whether they can be auto-installed.
For tools without built-in installers, install via SSH:
# uv (Python package manager) ssh <host-alias> "curl -LsSf https://astral.sh/uv/install.sh | sh" # bun (JavaScript runtime) ssh <host-alias> "curl -fsSL https://bun.sh/install | bash" # Node.js via nvm ssh <host-alias> "curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash && source ~/.bashrc && nvm install node" # Go ssh <host-alias> "curl -LO https://go.dev/dl/go1.22.0.linux-amd64.tar.gz && sudo tar -C /usr/local -xzf go1.22.0.linux-amd64.tar.gz"
After installing, update the host's `setup_commands` in `~/.rr/config.yaml` to source the new tools:
setup_commands:
- source ~/.local/bin/env # uv
- export PATH="$HOME/.bun/bin:$PATH" # bun
- export PATH="$HOME/.local/bin:$PATH"**If setup_commands reference missing files** (e.g., `source ~/.local/bin/env` fails):
1. Install the tool that creates that file (e.g., uv creates `~/.local/bin/env`) 2. Or remove/fix the setup_command in `~/.rr/config.yaml`
Run a real command to confirm everything works end-to-end:
rr test # if task defined # or rr run "make test" # or appropriate command for the project
| Problem | Fix | | ------------------- | ----------------------------------------------------------- | | SSH fails | Check `ssh <alias>` manually, verify `~/.ssh/config` | | "handshake failed" | Key not in agent: `ssh-add`, add `AddKeysToAgent yes` to SSH config | | "command not found" | Add `shell: "zsh -l -c"` or `setup_commands` to host config | | Sync slow | Add large dirs to `sync.exclude` | | Lock stuck | `rr unlock` | | Wrong directory | Check `dir` in global config |
When setting up rr programmatically, use `--machine` for structured JSON output that's easier to parse.
cat ~/.rr/config.yaml 2>/dev/null
**IF missing or empty:**
rr host add --name <name> --ssh "<alias>" --dir "~/projects/\${PROJECT}" --skip-proberr doctor --machine 2>&1
**Parse response:**
rr status --machine
**Parse `data.hosts[]` array:**
FOR each host in data.hosts:
IF host.healthy == true:
-> Host OK
ELSE:
-> FOR each alias in host.aliases:
-> Parse alias.error for diagnosis:
"timeout" -> Network/VPN issue
"auth" -> Key not deployed
"host key" -> First connection**Fix connectivity issues:**
rr exec "echo rr-test-ok" 2>&1 echo "Exit code: $?"
**Expected:** Output contains "rr-test-ok", exit code 0
**If fails:** P
Run heavy workloads on remote machines without the hassle. rr syncs your code to a remote machine and runs commands there. One command, no context switching. Your project rsyncs to the remote, the command runs, and output streams back.
Repo: rileyhilliard/rr
Automates the full release workflow: PR creation, merge, tagging, changelog update, and GitHub release.