AgentSkillsCN

rr

在远程机器上同步代码并运行命令。适用于远程运行测试、构建或命令,同步文件至主机、搭建远程开发环境,或排查 rr 配置问题时使用。

SKILL.md
--- frontmatter
name: rr
description: Sync code and run commands on remote machines. Use when running tests, builds, or commands remotely, syncing files to hosts, setting up remote development, or troubleshooting rr configuration.
user-invocable: true
allowed-tools:
  - Bash
  - Read
  - Edit
  - Grep
  - Glob

rr (Road Runner) CLI

rr syncs code to remote machines and runs commands there. Handles host failover, file sync with rsync, distributed locking, and test output formatting.

Quick Reference

bash
rr run "make test"     # Sync files + run command
rr exec "git status"   # Run command without syncing
rr sync                # Just sync files
rr <taskname>          # Run named task from config
rr doctor              # Diagnose issues
rr monitor             # TUI dashboard for host metrics

Two-Config System

rr uses two config files:

ConfigLocationPurpose
Global~/.rr/config.yamlPersonal host definitions (SSH, directories)
Project.rr.yamlShareable project settings (tasks, sync rules)

See config.md for complete config reference.

Minimal Global Config

yaml
version: 1
hosts:
  mini:
    ssh: [mac-mini.local, mac-mini-tailscale]
    dir: ${HOME}/projects/${PROJECT}

Minimal Project Config

yaml
version: 1
hosts: [mini]

sync:
  exclude: [.git/, node_modules/, .venv/]

tasks:
  test:
    run: pytest -v

Commands Overview

CommandPurpose
rr run "cmd"Sync files, then run command
rr exec "cmd"Run command without syncing
rr syncJust sync files
rr <taskname>Run named task
rr tasksList available tasks
rr doctorDiagnose issues
rr host list/add/removeManage hosts

See commands.md for full command reference.

Common Flags

  • --host <name> - Target specific host
  • --tag <tag> - Select host by tag
  • --local - Force local execution
  • --skip-requirements - Skip requirement checks

Tasks

Define reusable commands in .rr.yaml:

yaml
tasks:
  test:
    description: Run tests
    run: pytest -v

  deploy:
    steps:
      - name: Build
        run: make build
      - name: Deploy
        run: ./deploy.sh

Run with: rr test, rr deploy

Extra arguments append to single-command tasks: rr test -k "test_login"

See tasks.md for parallel tasks, multi-step tasks, and advanced configuration.

Remote Environment Bootstrap

Declare required tools with require: - rr verifies they exist before running commands:

yaml
# .rr.yaml
require:
  - go
  - node

tasks:
  build:
    run: make build
    require: [cargo]  # Task-specific requirement
yaml
# ~/.rr/config.yaml
hosts:
  gpu-box:
    ssh: [gpu.local]
    require: [nvidia-smi, python3]  # Host-specific requirements

Run with: rr test-all, rr quick-check

Setup Phase (Once Per Host)

Avoid redundant setup work (dependency sync, migrations) when multiple subtasks run on the same host:

yaml
tasks:
  test-all:
    setup: pip install -r requirements.txt   # Runs once per host
    parallel:
      - test-unit
      - test-integration
      - test-e2e

Setup runs exactly once per host before any subtasks execute. If a host runs 3 subtasks, setup runs once (not 3 times).

Parallel Task Flags

FlagPurpose
--streamShow real-time interleaved output with [host:task] prefixes
--verboseShow full output per task on completion
--quietSummary only
--fail-fastStop on first failure (overrides config)
--max-parallel NLimit concurrent tasks
--dry-runShow plan without executing
--localForce local execution (no remote hosts)

Task Dependencies

Define task execution order with depends. Tasks run their dependencies first, then execute their own command:

yaml
tasks:
  lint:
    run: golangci-lint run
  test:
    run: go test ./...
  build:
    run: go build ./...

  # Linear chain: lint -> test -> build
  ci:
    description: Full CI pipeline
    depends:
      - lint
      - test
      - build

Run with: rr ci

Parallel Groups in Dependencies

Run multiple dependencies simultaneously:

yaml
tasks:
  lint:
    run: golangci-lint run
  typecheck:
    run: mypy .
  test:
    run: pytest

  ci:
    depends:
      - parallel: [lint, typecheck]  # Run simultaneously
      - test                          # Run after parallel completes

Executes: [lint, typecheck] (parallel) -> test

Orchestrator Tasks

Tasks with only depends orchestrate without running their own command:

yaml
tasks:
  lint:
    run: golangci-lint run
  test:
    run: go test ./...

  verify:
    description: Run all checks
    depends: [lint, test]
    # No 'run' - just orchestrates

Dependency Flags

FlagPurpose
--skip-depsSkip dependencies, run only the target task
--from <task>Start from a specific task in the chain
bash
rr ci                  # Full dependency chain
rr ci --skip-deps      # Only run ci task itself
rr ci --from test      # Start from test, skip lint

Dependency Features

  • Deduplication: Tasks run once even if referenced multiple times (diamond deps)
  • Validation: Circular dependencies detected at config load
  • Fail-fast: Stops on first failure when fail_fast: true
  • Timeout: Honor timeout field for entire dependency chain

Output Modes

  • progress (default): Live status indicators with spinners
  • stream: Real-time output with [host:task] prefixes
  • verbose: Full output shown when each task completes
  • quiet: Summary only at the end

Example:

bash
rr test-all --stream    # See all output in real-time
rr test-all --dry-run   # Preview what would run
rr test-all --local     # Run locally without remote hosts

Missing tools trigger actionable error messages. Tools with built-in installers (40+) can be auto-installed.

See requirements.md for complete requirements reference.

How It Works

  1. Host Selection: Tries SSH aliases in order until one connects
  2. Requirements: Verifies required tools exist (if configured)
  3. File Sync: Uses rsync with exclude/preserve patterns
  4. Locking: Creates lock on remote; if locked, tries next host
  5. Execution: Runs command with configured environment

Troubleshooting

ProblemFix
SSH failsCheck ssh <alias> manually, verify ~/.ssh/config
"handshake failed" but ssh worksKey not in agent: ssh-add ~/.ssh/id_rsa, add AddKeysToAgent yes to SSH config
"command not found"Add setup_commands or check require config
Sync slowAdd large dirs to sync.exclude
Lock stuckrr unlock

See troubleshooting.md for detailed diagnostics.

Machine Interface (LLM/CI)

Use --machine or -m for structured JSON output:

bash
rr doctor --machine
rr status --machine
rr tasks --machine

See machine-interface.md for JSON envelope format and error codes.

Quick Setup

bash
# 1. Add a host
rr host add

# 2. Initialize project
cd your-project && rr init

# 3. Verify
rr doctor

# 4. Run
rr run "make test"

When to Use Each Command

SituationCommand
Run tests with latest coderr run "make test"
Quick check on remoterr exec "git log -1"
Prep remote before multiple runsrr sync
Debug connection issuesrr doctor
Watch resource usagerr monitor
First time setuprr init
Add new machinerr host add

Reference Files