بنقرة واحدة
update-team
Update agent team services with latest configuration from setup-agent-team and restart them
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Update agent team services with latest configuration from setup-agent-team and restart them
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
Delete stale git branches (local + remote) that have no open PR, and prune worktrees.
SPA (Spawn's Personal Agent) — Slack bot that pipes threads into Claude Code sessions
Create child cloud VMs with AI coding agents using the spawn CLI
استنادا إلى تصنيف SOC المهني
| name | update-team |
| description | Update agent team services with latest configuration from setup-agent-team and restart them |
| argument-hint | [service-name] [--check-only] |
| allowed-tools | Bash, Read, Edit, Glob, Grep |
Update the trigger server and wrapper scripts with the latest configuration from .claude/skills/setup-agent-team/SKILL.md, then restart the services to apply changes.
service-name (optional) — Update only this service (e.g., discovery, refactor, security, qa). If omitted, updates all services.--check-only — Show what would be updated without making changes or restarting services.$ARGUMENTS
This skill:
start-*.sh wrappersDetect the current repository path:
REPO_ROOT="$(cd /root/spawn 2>/dev/null && pwd || cd /home/sprite/spawn 2>/dev/null && pwd)"
echo "Repository root: $REPO_ROOT"
Determine home directory:
if [[ "$REPO_ROOT" == "/root/spawn" ]]; then
HOME_DIR="/root"
SERVICE_USER="root"
SERVICE_GROUP="root"
elif [[ "$REPO_ROOT" == "/home/sprite/spawn" ]]; then
HOME_DIR="/home/sprite"
SERVICE_USER="sprite"
SERVICE_GROUP="sprite"
else
echo "ERROR: Unknown repository path: $REPO_ROOT"
exit 1
fi
echo "Home directory: $HOME_DIR"
echo "Service user/group: $SERVICE_USER/$SERVICE_GROUP"
Read the SKILL.md to check for:
cat "$REPO_ROOT/.claude/skills/setup-agent-team/SKILL.md"
Key things to extract from SKILL.md:
TRIGGER_SECRET, TARGET_SCRIPT, REPO_ROOT, CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS, MAX_CONCURRENT, RUN_TIMEOUT_MSRUN_TIMEOUT_MS values per serviceFind all wrapper scripts:
ls -1 "$REPO_ROOT/.claude/skills/setup-agent-team/start-"*.sh 2>/dev/null | while read -r wrapper; do
basename "$wrapper" | sed 's/^start-//;s/\.sh$//'
done
For each service found, check if it has a corresponding systemd unit:
systemctl list-units --all --type=service --plain --no-legend | grep -E 'discovery-trigger|refactor|spawn-security|spawn-qa' | awk '{print $1}'
Match wrappers to systemd units:
start-discovery.sh → discovery-trigger.servicestart-refactor.sh → refactor.servicestart-security.sh → spawn-security.servicestart-qa.sh → spawn-qa.service (if exists)For each wrapper script, verify it has:
# Check if wrapper has all required env vars
grep -q 'export TRIGGER_SECRET=' "$wrapper_path" || echo "MISSING: TRIGGER_SECRET"
grep -q 'export TARGET_SCRIPT=' "$wrapper_path" || echo "MISSING: TARGET_SCRIPT"
grep -q 'export REPO_ROOT=' "$wrapper_path" || echo "MISSING: REPO_ROOT"
grep -q 'export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1' "$wrapper_path" || echo "MISSING: CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS"
grep -q 'export MAX_CONCURRENT=' "$wrapper_path" || echo "MISSING: MAX_CONCURRENT"
grep -q 'export RUN_TIMEOUT_MS=' "$wrapper_path" || echo "MISSING: RUN_TIMEOUT_MS"
# Extract SCRIPT_DIR from wrapper
SCRIPT_DIR=$(grep '^SCRIPT_DIR=' "$wrapper_path" | cut -d'"' -f2)
# Verify it matches REPO_ROOT
if [[ "$SCRIPT_DIR" != "$REPO_ROOT/.claude/skills/setup-agent-team" ]]; then
echo "WARNING: SCRIPT_DIR mismatch"
echo " Found: $SCRIPT_DIR"
echo " Expected: $REPO_ROOT/.claude/skills/setup-agent-team"
fi
# Verify it uses exec bun run
grep -q 'exec bun run "${SCRIPT_DIR}/trigger-server.ts"' "$wrapper_path" || echo "WARNING: Non-standard exec pattern"
For each systemd service file at /etc/systemd/system/<service-name>.service:
# Check critical fields
grep -q "^User=$SERVICE_USER$" "$service_file" || echo "MISSING/WRONG: User"
grep -q "^Group=$SERVICE_GROUP$" "$service_file" || echo "MISSING/WRONG: Group"
grep -q "^WorkingDirectory=$REPO_ROOT/.claude/skills/setup-agent-team$" "$service_file" || echo "MISSING/WRONG: WorkingDirectory"
grep -q "^ExecStart=/bin/bash $REPO_ROOT/.claude/skills/setup-agent-team/start-" "$service_file" || echo "MISSING/WRONG: ExecStart"
# Check PATH includes correct home directory
grep "^Environment=\"PATH=$HOME_DIR/.bun/bin:$HOME_DIR/.local/bin:" "$service_file" || echo "WARNING: PATH may be incorrect"
# Check HOME is set
grep "^Environment=\"HOME=$HOME_DIR\"$" "$service_file" || echo "MISSING/WRONG: HOME"
# Check IS_SANDBOX
grep -q '^Environment="IS_SANDBOX=1"' "$service_file" || echo "MISSING: IS_SANDBOX"
If --check-only is NOT passed and issues were found:
For path mismatches, update SCRIPT_DIR:
# This requires preserving the TRIGGER_SECRET value
# Read current secret
CURRENT_SECRET=$(grep '^export TRIGGER_SECRET=' "$wrapper_path" | cut -d'"' -f2)
# Update SCRIPT_DIR line
sed -i "s|^SCRIPT_DIR=.*|SCRIPT_DIR=\"$REPO_ROOT/.claude/skills/setup-agent-team\"|" "$wrapper_path"
# Update REPO_ROOT line
sed -i "s|^export REPO_ROOT=.*|export REPO_ROOT=\"$REPO_ROOT\"|" "$wrapper_path"
For missing env vars, add them:
# Add CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS if missing
if ! grep -q 'CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS' "$wrapper_path"; then
# Insert before exec line
sed -i '/^exec bun run/i export CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1' "$wrapper_path"
fi
# Add MAX_CONCURRENT if missing (default: 5)
if ! grep -q 'MAX_CONCURRENT' "$wrapper_path"; then
sed -i '/^exec bun run/i export MAX_CONCURRENT=5' "$wrapper_path"
fi
# Add RUN_TIMEOUT_MS if missing (default: 4 hours)
if ! grep -q 'RUN_TIMEOUT_MS' "$wrapper_path"; then
sed -i '/^exec bun run/i export RUN_TIMEOUT_MS=14400000' "$wrapper_path"
fi
If systemd service files need updates:
IMPORTANT: Changes to systemd service files require sudo and a daemon-reload.
# Update User/Group
sudo sed -i "s/^User=.*/User=$SERVICE_USER/" "$service_file"
sudo sed -i "s/^Group=.*/Group=$SERVICE_GROUP/" "$service_file"
# Update WorkingDirectory
sudo sed -i "s|^WorkingDirectory=.*|WorkingDirectory=$REPO_ROOT/.claude/skills/setup-agent-team|" "$service_file"
# Update ExecStart
sudo sed -i "s|^ExecStart=.*|ExecStart=/bin/bash $REPO_ROOT/.claude/skills/setup-agent-team/start-$service_name.sh|" "$service_file"
# Update PATH
sudo sed -i "s|^Environment=\"PATH=.*|Environment=\"PATH=$HOME_DIR/.bun/bin:$HOME_DIR/.local/bin:$HOME_DIR/.claude/local/bin:/usr/local/bin:/usr/bin:/bin\"|" "$service_file"
# Update HOME
sudo sed -i "s|^Environment=\"HOME=.*|Environment=\"HOME=$HOME_DIR\"|" "$service_file"
# Reload systemd
sudo systemctl daemon-reload
If changes were made (and not --check-only):
# Restart each updated service
sudo systemctl restart "$service_name"
# Wait a moment for startup
sleep 2
# Check status
sudo systemctl status "$service_name" --no-pager
For each service, test the health endpoint:
# Test health endpoint (should return 200 OK)
curl -sf http://localhost:8080/health || echo "ERROR: Health check failed for $service_name"
# Expected output: {"status":"ok","running":N,"max":N,...}
If health check fails:
# Check recent logs
sudo journalctl -u "$service_name" -n 20 --no-pager
Print a summary:
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Update Summary"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Repository: $REPO_ROOT"
echo "Home: $HOME_DIR"
echo "Services checked: $total_services"
echo "Services updated: $updated_count"
echo "Services restarted: $restarted_count"
echo "Services healthy: $healthy_count"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
If all services are healthy:
✅ All services are up to date and running
If there were issues:
⚠️ Some services may need attention - check logs above
| Issue | Fix |
|---|---|
EADDRINUSE on restart | Another service already using port 8080 — check with fuser -k 8080/tcp |
| Permission denied | Systemd files need sudo: sudo systemctl restart <service> |
| Health check fails | Check logs: sudo journalctl -u <service> -n 50 |
| Wrapper not executable | chmod +x .claude/skills/setup-agent-team/start-*.sh |
| PATH incorrect | Update systemd service Environment="PATH=..." to match home dir |
| Service won't start after update | Check systemctl status <service> for detailed error |
--check-only first to see what would change before applying updatescurl -X POST http://localhost:8080/trigger -H "Authorization: Bearer $SECRET"Check all services without making changes:
claude /update-team --check-only
Update a specific service:
claude /update-team discovery
Update all services:
claude /update-team