Skip to content
Development
Skill

/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
2476 skills1 MCP
Install
$ npx -y skills add prassanna-ravishankar/repowire --skill integration-test --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/integration-test

Context preview

The summary Claude sees to decide when to auto-load this skill.

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.

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.

# 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
uv tool list 2>/dev/null | grep repowire || echo "No uv tool installation"
python3 -c "import json; d=json.load(open('$HOME/.claude/settings.json')); print('Hooks:', list(d.get('hooks',{}).keys()))" 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
pkill -f websocket_hook 2>/dev/null || true

curl -s http://127.0.0.1:8377/health >/dev/null 2>&1 && {
  repowire 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):

# Uninstall
repowire uninstall 2>/dev/null || true
uv tool uninstall repowire 2>/dev/null || true

# Install as tool from local source
uv tool install --force /path/to/repowire

# Setup hooks and MCP server
repowire setup --no-service

# Verify
repowire --version
python3 -c "import json; d=json.load(open('$HOME/.claude/settings.json')); print('Hooks:', list(d.get('hooks',{}).keys()))"
ls ~/.opencode/plugin/repowire.ts 2>/dev/null && echo "OpenCode plugin: OK"

Phase 5: Ensure Daemon Running

curl -s http://127.0.0.1:8377/health || {
  nohup repowire 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 -s http://127.0.0.1:8377/peers | python3 -c "
import sys, json, re
peers = json.load(sys.stdin)['peers']
expected = {'$PEER_A1': 'circle-a', '$PEER_A2': 'circle-a', '$PEER_B1': 'circle-b'}
for name, circle in expected.items():
    match = [p for p in peers if p['name'] == name and p['status'] == 'online']
    ok = match and match[0].get('circle') == circle and re.match(r'^repow-[\w-]+-[a-f0-9]{8}$', match[0].get('peer_id',''))
    print(f'  {name}: {\"PASS\" if ok else \"FAIL\"} ({match[0] if match else \"not found\"})')
"

If a peer doesn't register, check `.claude/settings.local.json` for `disableAllHooks: true`.

Tests

1. **Direct query to peer-a1**

   repowire peer ask $PEER_A1 "What is this project about in one sentence?" -t 120

Expected: Direct response describing the proj

Read more
Ships withrepowire

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

Get the whole plugin