Skip to content

/integration-test

Integration test for repowire peer-to-peer messaging. Supports claude-code, opencode, or mixed-agent-type testing with circle boundaries and cross-agent-type communication. Can run all modes in parallel via agent teams.

From plugin
repowire
2707 skills1 MCP

Claude Code

$ npx -y skills add prassanna-ravishankar/repowire --skill integration-test --agent claude-code

SKILL.md

integration-test.SKILL.md
name: integration-test
description: Integration test for repowire peer-to-peer messaging. Supports claude-code, opencode, or mixed-agent-type testing with circle boundaries and cross-agent-type communication. Can run all modes in parallel via agent teams.

Repowire Integration Test

Unified integration test for peer-to-peer communication across agent types.

Execution Modes

| Argument | Behavior | |----------|----------| | `claude-code` | Test Claude Code agent type only | | `opencode` | Test OpenCode agent type only | | `mixed` | Test cross-agent-type communication | | `all` or no argument | Run all three modes in parallel using agent teams |

Team-Based Parallel Execution

When `all` is specified (or no argument), the lead agent should:

1. Run Phase 1 (environment discovery) and Phase 3 (pre-test teardown) itself 2. Ask user for project directories and opencode model (Phase 2) 3. Ensure daemon is running 4. Create tasks for each mode and spawn background agents in parallel:

  • Agent `test-claude-code` → runs claude-code tests
  • Agent `test-opencode` → runs opencode tests
  • Agent `test-mixed` → runs mixed tests (depends on both agent types being available)

5. Collect results and produce unified report

Spawning agents

Use the Task tool with `run_in_background: true` to run modes in parallel:

Task(subagent_type="general-purpose", run_in_background=true, prompt="Run the claude-code integration test. [paste mode section]")
Task(subagent_type="general-purpose", run_in_background=true, prompt="Run the opencode integration test. [paste mode section]")

Each agent gets the full context for its mode and runs independently.

Phase 1: Environment Discovery

Run these commands to understand current state. Keep all phases in the same shell so `REPOWIRE_BIN` continues to identify the exact binary under test.

# Pin every command in this workflow to one binary. Phase 4 replaces this with
# the freshly built checkout binary when a fresh install is requested.
REPOWIRE_BIN="$(command -v repowire || true)"
export REPOWIRE_BIN

# System checks
tmux list-sessions 2>/dev/null || echo "No tmux sessions"
which opencode 2>/dev/null || echo "opencode not in PATH"
which claude 2>/dev/null || echo "claude not in PATH"

# Daemon and peer status
curl -s http://127.0.0.1:8377/health 2>/dev/null | jq . || echo "Daemon not running"
curl -s http://127.0.0.1:8377/peers 2>/dev/null | jq '.peers[] | {name, status, circle}' || echo "No peers"

# Installation status
test -n "$REPOWIRE_BIN" && "$REPOWIRE_BIN" --version || echo "Repowire not installed"
jq -r '"Hooks: " + ((.hooks // {}) | keys | join(", "))' "$HOME/.claude/settings.json" 2>/dev/null || echo "No Claude hooks"
ls ~/.opencode/plugin/repowire.ts 2>/dev/null && echo "OpenCode plugin installed" || echo "No OpenCode plugin"

Phase 2: Ask User for Configuration

Ask user for: 1. **Project directories** (2-3 depending on mode, or ask for all if running `all`) 2. **OpenCode model** (e.g., `anthropic/claude-sonnet-4-5-20250929`) — needed for opencode/mixed modes 3. **Fresh install?** — removes existing hooks/plugins and reinstalls

Phase 3: Pre-Test Teardown (Always Run)

tmux kill-session -t circle-a 2>/dev/null || true
tmux kill-session -t circle-b 2>/dev/null || true
tmux kill-session -t opencode-test 2>/dev/null || true
tmux kill-session -t mixed-test 2>/dev/null || true
curl -s http://127.0.0.1:8377/health >/dev/null 2>&1 && {
  "$REPOWIRE_BIN" peer prune --force 2>/dev/null || true
}

rm -f ~/.repowire/pending/*.json 2>/dev/null || true
rm -f ~/.repowire/sessions.json 2>/dev/null || true

Phase 4: Fresh Install (if requested)

**IMPORTANT:** `repowire setup` calls `claude mcp add` which fails inside a Claude Code session. Run these commands in a **tmux pane**, not from within Claude Code.

# Run in a tmux pane (e.g. tmux send-keys to a spare window):

# Build from local source
cd /path/to/repowire
mkdir -p bin
(cd daemon-go && go build -o ../bin/repowire .)
REPOWIRE_BIN="$(pwd)/bin/repowire"
export REPOWIRE_BIN

# Setup hooks and MCP server
"$REPOWIRE_BIN" setup --no-service

# Verify
"$REPOWIRE_BIN" --version
jq -r '"Hooks: " + ((.hooks // {}) | keys | join(", "))' "$HOME/.claude/settings.json"
ls ~/.opencode/plugin/repowire.ts 2>/dev/null && echo "OpenCode plugin: OK"

Phase 5: Ensure Daemon Running

test -x "$REPOWIRE_BIN" || { echo "REPOWIRE_BIN is not executable: $REPOWIRE_BIN" >&2; exit 1; }
curl -s http://127.0.0.1:8377/health || {
  nohup "$REPOWIRE_BIN" serve > /tmp/repowire-daemon.log 2>&1 &
  sleep 3
}
curl -s http://127.0.0.1:8377/health | jq .

---

Mode: claude-code

**Requires:** tmux, claude CLI, Claude hooks installed **Tmux sessions used:** `circle-a`, `circle-b` **Project directories needed:** 3 (2 for circle-a, 1 for circle-b)

Setup

tmux new-session -d -s circle-a -n peer-a1
tmux new-window -t circle-a -n peer-a2
tmux new-session -d -s circle-b -n peer-b1

tmux send-keys -t circle-a:peer-a1 "cd $PROJECT_A1 && claude --dangerously-skip-permissions" Enter
sleep 3
tmux send-keys -t circle-a:peer-a2 "cd $PROJECT_A2 && claude --dangerously-skip-permissions" Enter
sleep 3
tmux send-keys -t circle-b:peer-b1 "cd $PROJECT_B1 && claude --dangerously-skip-permissions" Enter
sleep 30  # Wait for sessions to initialize and hooks to register

Verify Registration

# All 3 peers should be online with correct circles and peer_id format
curl -fsS http://127.0.0.1:8377/peers | jq -e --arg a1 "$PEER_A1" --arg a2 "$PEER_A2" --arg b1 "$PEER_B1" '
  def valid($name; $circle):
    [.peers[] | select(
      .name == $name and
      .status == "online" and
      .circle == $circle and
      (.peer_id | test("^repow-" + $circle + "-[a-f0-9]{8}$"))
    )] | length == 1;
  if valid($a1; "circle-a") and valid($a2; "circle-a") and valid($b1; "circle-b") then
    [.peers[] | select(.name == $a1 or .name == $a2 or .name == $b1) |
     {name, s
Read more
@prassanna-ravishankar
Ships withrepowire

May the agents talk. Connect Claude Code, Opencode, Codex, Pi across projects, across machines and with your telegram

Stars on GitHub

Momentum

stars in total
270
Star history of prassanna-ravishankar/repowire on GitHub, a chart by star-history.com

Other skills on repowire.

delegate
Auto-invoked

delegate

Hand a task to another AI agent peer over the repowire mesh — reuse an existing peer on the chosen backend, or spawn one if none…

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills13d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react4d252k
@facebook@facebookInstall Skill

Questions about integration-test.

Which coding agents can use integration-test?
integration-test installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.