npx skills add https://github.com/s-hiraoku/synapse-a2a --skill opencode-expertInstala esta habilidad con la CLI y comienza a usar el flujo de trabajo SKILL.md en tu espacio de trabajo.
🌐 Language: English | 日本語 | 中文 | 한국어 | Español | Français
Enable agents to collaborate on tasks without changing their behavior
A framework that enables inter-agent collaboration via the Google A2A Protocol while keeping CLI agents (Claude Code, Codex, Gemini, OpenCode, GitHub Copilot CLI) exactly as they are
This golden path starts two background agents and sends one visible cross-agent message in four commands.
Prerequisites (not counted): run uv sync, and make sure authenticated claude and codex CLIs are installed on your PATH.
uv run synapse start claude --port 8108
What to expect: Synapse starts a Claude A2A server in the background and prints a PID plus the log path.
uv run synapse start codex --port 8122
What to expect: Synapse starts a Codex A2A server in the background and prints a PID plus the log path.
uv run synapse list --plain
What to expect: the one-shot agent list includes synapse-claude-8108 and synapse-codex-8122; wait or answer any agent prompt until both show READY.
uv run synapse send synapse-codex-8122 "Reply with exactly: SYNAPSE_GOLDEN_PATH_OK" --from synapse-claude-8108 --wait
What to expect: Codex receives an A2A message from Claude and the command prints a reply containing SYNAPSE_GOLDEN_PATH_OK. If the send call fails with a UDS or HTTP timeout, run uv run synapse list --plain again and wait until both agents show READY before rerunning. If the receiver pauses for approval, answer the prompt in the agent terminal.
Cleanup (not counted):
uv run synapse kill claude-8108 -f
uv run synapse kill codex-8122 -f
See issue #604 for context.
┌─────────────────────────────────────────────────────────────────┐
│ ✅ Non-Invasive: Don't change agent behavior │
│ ✅ Collaborative: Enable agents to work together │
│ ✅ Transparent: Maintain existing workflows │
└─────────────────────────────────────────────────────────────────┘
Synapse A2A transparently wraps each agent's input/output without modifying the agent itself. This means:
See Project Philosophy for details.
flowchart LR
subgraph Terminal1["Terminal 1"]
subgraph Agent1["synapse claude :8100"]
Server1["A2A Server"]
PTY1["PTY + Claude CLI"]
end
end
subgraph Terminal2["Terminal 2"]
subgraph Agent2["synapse codex :8120"]
Server2["A2A Server"]
PTY2["PTY + Codex CLI"]
end
end
subgraph External["External"]
ExtAgent["Google A2A Agent"]
end
Server1 <-->|"POST /tasks/send"| Server2
Server1 <-->|"A2A Protocol"| ExtAgent
Server2 <-->|"A2A Protocol"| ExtAgent
| Category | Feature |
|---|---|
| A2A Compliant | All communication uses Message/Part + Task format, Agent Card discovery |
| Agent Card Context Extension | Pass system context (ID, routing rules, other agents) via x-synapse-context to keep PTY clean |
| CLI Integration | Turn existing CLI tools into A2A agents without modification |
| synapse send | Send messages between agents via synapse send <agent> "message". Waits up to 30s for PROCESSING targets to finish before delivering (skipped for --force, priority 5, and --silent) |
| Sender Identification | Auto-identify sender via SYNAPSE_AGENT_ID env var → metadata.sender + PID matching (process ancestry, fallback) |
| Readiness Gate | /tasks/send returns 503 until agent initialization completes; priority 5 and replies bypass |
| Priority Interrupt | Priority 5 sends SIGINT before message (emergency stop) |
| Multi-Instance | Run multiple agents of the same type (automatic port assignment) |
| External Integration | Communicate with other Google A2A agents |
| File Safety | Prevent multi-agent conflicts with file locking and change tracking (visible in synapse list) |
| Agent Naming | Custom names and roles for easy identification (synapse send my-claude "hello") |
| Agent Summary | Persistent 120-char agent summary (synapse set-summary). Manual text, --auto from git context, or --clear. Visible in Canvas, MCP list_agents, Agent Card extensions.synapse, and synapse list --columns SUMMARY |
| Agent Monitor | Real-time status (READY/WAITING/PROCESSING/DONE), CURRENT task preview, terminal jump |
| Task History | Automatic task tracking with search, export, and statistics (enabled by default) |
| Quality Gates | Configurable hooks (on_idle, on_task_completed) that control status transitions |
| Permission Detection | WAITING status maps to A2A input_required with x-permission-prompt metadata. Child agents send structured escalation metadata to their parent, which can auto-approve/deny via the Approval Gate or fall back to manual POST /tasks/{id}/permission/approve and /deny. In synapse send --wait, the sender now keeps polling until the parent intervenes or the timeout expires. Each profile defines a deny_response for rejection. See Permission Modes |
| Plan Approval | Plan-mode workflow with synapse approve/reject for human-in-the-loop review |
| Graceful Shutdown | synapse kill sends shutdown request before SIGTERM (30s timeout, -f for force). Worktree branches are auto-merged back to the base branch on kill (uncommitted changes are WIP-committed first; conflicts preserve the branch with a warning). Use --no-merge to skip auto-merge |
| Delegate Mode | --delegate-mode makes an agent a manager that delegates instead of editing files |
| Auto-Spawn Panes | synapse team start — 1st agent takes over current terminal, others in new panes. Defaults to --worktree isolation (opt out with --no-worktree). --all-new to start all in new panes. Supports profile:name:role:skill_set:port spec (tmux/iTerm2/Terminal.app/Ghostty/zellij) |
| Soft Interrupt | synapse interrupt <target> "message" — Ergonomic shorthand for synapse send -p 4 --silent to quickly interrupt an agent |
| Token/Cost Tracking | Skeleton for per-agent token usage tracking; synapse history stats shows TOKEN USAGE section when data exists |
| Saved Agent Definitions | synapse agents add/list/show/delete — Save reusable agent templates (profile + name + role + skill set) with persistent Agent IDs. synapse spawn accepts Agent IDs/names in addition to profile names |
| Spawn Single Agent | synapse spawn <profile|saved-agent> — Spawn a single agent in a new terminal pane or window. Accepts profile names or saved agent IDs/names. Auto-tiles (tmux): when a second or subsequent agent is spawned, tmux select-layout tiled is automatically applied for even pane distribution (no flags needed). Use --worktree / -w for Synapse-native git worktree isolation (all agents, .synapse/worktrees/). --branch / -b auto-enables --worktree and sets the base branch (defaults to origin/main). Use --no-worktree to opt out. --task "message" / --task-file path auto-sends a task after the agent becomes READY (with --task-timeout, --wait/--notify/--silent). Recommended pattern: synapse spawn <profile> --task-file <path> --task-timeout 600 --notify. Legacy -- --worktree also supported for Claude Code only |
| CI Automation | PostToolUse hooks detect git push/gh pr create and auto-poll CI status, merge conflicts, and CodeRabbit reviews. Skills: /check-ci, /fix-ci, /fix-conflict, /fix-review |
| Learning Mode | Two independent flags: SYNAPSE_LEARNING_MODE_ENABLED=true enables Prompt Improvement section; SYNAPSE_LEARNING_MODE_TRANSLATION=true enables JP-to-EN Learning section. Either flag activates learning.md injection and Tips. Response uses normal formatting (no separators); structured formatting (━━━ separators, section headers) applies only to feedback sections (Prompt Improvement, JP-to-EN Learning, Tips) |
| Proactive Mode | SYNAPSE_PROACTIVE_MODE_ENABLED=true guides agents to use Synapse features (shared memory, canvas, file safety, delegation, broadcast) based on a task-size x feature matrix. Small tasks skip most features; medium tasks use them selectively; large tasks require full coordination. Per-feature skip conditions prevent unnecessary overhead. Follows the learning_mode pattern: env var activation + .synapse/proactive.md instruction file appended at startup. Off by default |
| Shared Memory | Deprecated — superseded by LLM Wiki (see below). User-global SQLite knowledge base (~/.synapse/memory.db) for cross-agent knowledge sharing. Agents save, search, and retrieve learned knowledge across sessions (synapse memory save/list/search/show/delete/stats). API endpoints at /memory/*. Enabled by default (SYNAPSE_SHARED_MEMORY_ENABLED=true). New knowledge should use synapse wiki instead. See Shared Memory vs LLM Wiki |
| LLM Wiki | Knowledge accumulation layer inspired by Karpathy's LLM Wiki pattern. Agents build and maintain a structured, interlinked Markdown knowledge base with frontmatter metadata, [[wikilink]] cross-references, and confidence scores. Two scopes: .synapse/wiki/ (project) and ~/.synapse/wiki/ (global). CLI: synapse wiki ingest/query/lint/status/refresh/init. Living Docs: pages track source_files and source_commit in frontmatter; lint/status detect stale pages when tracked files change; refresh --apply updates commit SHAs. Page types: entity, concept, decision, comparison, synthesis, learning. Canvas Knowledge view at #/knowledge; GET /api/wiki/graph returns a Mermaid diagram of page links. MCP instruction synapse://instructions/wiki. Config: wiki.enabled (default true). See LLM Wiki Design |
| Session Save/Restore | Save running team configurations as named snapshots and restore them later (synapse session save/list/show/restore/delete/sessions). Each agent's CLI conversation session_id is automatically captured and stored in the registry at startup. Restoring with --resume uses the saved session_id to resume each agent's conversation history, with an automatic 10-second timeout fallback if resume fails (see the Resume Mode section in the guide for details) |
| Workflow | Define reusable YAML-based message sequences and execute them with synapse workflow run. Each workflow is a named list of steps (target, message, priority, response_mode). Supports --dry-run to preview, --continue-on-error for resilient execution, --auto-spawn for automatic agent spawning, and --async for background execution (returns run_id; check progress with synapse workflow status <run_id>). target: self: steps can target the calling agent itself; a helper agent is auto-spawned to avoid deadlock (nested workflow execution from helpers is forbidden, max depth 1). Persistent execution history: completed runs are stored in SQLite (.synapse/workflow_runs.db) and survive server restarts; active runs are cached in memory with DB fallback. Workflow-level trigger and auto_spawn fields enable skill auto-generation: creating or syncing a workflow produces a SKILL.md (marked <!-- synapse-workflow-autogen -->) in .claude/skills/ and .agents/skills/, making workflows discoverable as slash-command skills. Use synapse workflow sync to regenerate all skills and remove orphans. Stored in .synapse/workflows/ (project) or ~/.synapse/workflows/ (user). See Workflow Self-Target |
| Canvas | Shared visual output surface for agents. Renders diagrams (Mermaid with theme-synced palettes), tables, charts, code, diffs, and 25 content formats in a browser UI. Enhanced markdown rendering with tables, blockquotes, ordered lists, and inline formatting via a built-in state-machine parser. Includes progress, terminal, dependency-graph, and cost card types. Supports 6 layout templates: briefing, comparison, dashboard, steps, slides, plan for structured multi-block cards. Plan Card template visualizes task plans with Mermaid DAG + step list, status tracking (proposed/active/completed/cancelled). Task card expand/collapse state persists across dashboard polling updates. HTML Artifact Support: format: "html" sandboxed iframes with parent-iframe theme sync (CSS variables --bg, --fg, --border via postMessage), auto-resize (ResizeObserver), dark mode CSS, and full document normalization (extracts head/body from <!doctype html> documents). CLI shortcuts: synapse canvas mermaid/markdown/table/chart/briefing/plan/.... Server: synapse canvas serve (port 3000). Agent Control: interactive Agent Control tab (formerly "Admin") for sending messages to agents, viewing responses, and managing the fleet from the browser. Agent selection via clickable table rows (double-click to jump to agent's terminal, right-click context menu with Kill Agent action and confirm modal), multi-line textarea with Cmd+Enter, IME support, multi-artifact response extraction, terminal junk stripping. Card Download: export any card via GET /api/cards/{card_id}/download?format={format} — all 25 content formats map to optimal download formats (Markdown, JSON, CSV, HTML, native); 6 templates export as Markdown/JSON. Download buttons in card grid headers and Spotlight title bar. Clipboard Copy: copy any card as Markdown to the clipboard via the copy button (reuses the download endpoint with ?format=md); available in both card grid headers and Spotlight view. Spotlight navigation: keyboard shortcuts (ArrowLeft/Right to navigate cards, Escape to exit manual navigation and return to live/latest mode), spotlight-swap animations, template badge in title bar, minimal info bar mode, and mobile-responsive layout. DB Browser: sidebar tree + paginated table view for inspecting Synapse SQLite databases (/api/db/list, /api/db/{db}/{table} endpoints; task_board.db is excluded). Dashboard: responsive auto-fit grid layout. Accessibility: agent panel uses role=button, tabindex, aria-expanded, and focus-visible styling. Sidebar menu: Canvas, History, Dashboard, Agent Control, Workflow, Database, Harnesses (landing) / Skills (tree-table of discovered skills at #/harnesses/skills; two-level hierarchy: User Global (subdivided by agent harness: Claude Code .claude/skills/** vs shared .agents/skills/**) → Projects (per-directory, further split by agent bucket when applicable) → Synapse Central Store; columns NAME / DESCRIPTION / LOCATION; collapsible with incremental name filter) / MCP Servers (tree-table of configured MCP servers at #/harnesses/mcp; two-level hierarchy: User Global (subdivided per agent: Claude Code ~/.claude.json, Codex ~/.codex/config.toml TOML, Gemini ~/.gemini/settings.json, OpenCode ~/.config/opencode/opencode.json, Claude Desktop) → Projects (per .mcp.json; projects without one render as a dashed-folder "no .mcp.json" row so scanned-but-unconfigured is distinguished from not-seen); columns NAME / COMMAND / DETAILS where DETAILS shows transport type and env:KEY chips — env values are never sent to the browser), System. See Canvas Design, Admin Command Center |
| Smart Suggest | analyze_task MCP tool analyzes user prompts and returns a delegation_strategy (self, subagent, or spawn) along with rich context (diff_stats, file_conflicts, dependencies, parallelizable) and a recommended_worktree field (true when spawn strategy or high file conflicts detected). Accepts optional files and agent_type params. When collaboration would be beneficial, suggests team/task splits displayed as Plan Cards on Canvas. Trigger conditions (file count, multi-directory changes, missing tests, prompt complexity, keywords) are configurable via .synapse/suggest.yaml. See Smart Suggest Design (Japanese) |
| Proactive Collaboration | Agents automatically evaluate collaboration opportunities before starting tasks. Built-in decision framework: do-it-yourself, delegate, ask-for-help, report-progress, share-knowledge. Cross-model spawning preference distributes token usage and avoids rate limits. Worker agents can also spawn/delegate (not just managers). Mandatory cleanup of spawned agents (synapse kill <name> -f) |
| Self-Learning Pipeline | Observation layer captures PTY and A2A signals into .synapse/observations.db. synapse learn analyzes repeated patterns and persists instincts (.synapse/instincts.db). synapse instinct lists/promotes learned instincts. synapse evolve clusters instincts into reusable skill candidates. Pipeline: Observation → Pattern Analyzer → Instinct → Evolve. Env: SYNAPSE_OBSERVATION_ENABLED (default true), SYNAPSE_OBSERVATION_DB_PATH, SYNAPSE_INSTINCT_DB_PATH |
| MCP Bootstrap | synapse mcp serve exposes bootstrap resources (instructions, settings, agent card) and tools (bootstrap_agent, list_agents, analyze_task) via the Model Context Protocol over stdio. Lets MCP-capable agents pull Synapse context with a minimal PTY startup bootstrap instead of the full initial instruction payload. When a Synapse MCP server config entry is detected, Synapse sends a short MCP bootstrap message at startup and keeps approval prompts enabled unless the session is resumed; non-Synapse MCP entries do not trigger this path. Copilot MCP config: ~/.copilot/mcp-config.json. See MCP Bootstrap Design (Japanese) |
| Multi-Agent Patterns | Declarative coordination patterns that define how agents should behave rather than what to do (contrast with imperative Workflows). Five built-in pattern types: generator-verifier (generate + verify against criteria), orchestrator-subagent (decompose and delegate), agent-teams (parallel workers on a task queue), message-bus (pub/sub event-driven coordination), shared-state (agents collaborate via shared wiki). CLI: synapse multiagent init/list/show/run/status/stop (alias synapse map). Pattern configs stored in .synapse/patterns/ (project) or ~/.synapse/patterns/ (user). Canvas integration: Pattern tab with list/detail views at /api/multiagent endpoints. --dry-run to preview, --async for background execution |
# pipx (recommended)
pipx install synapse-a2a
# Or run directly with uvx (no install)
uvx synapse-a2a claude
WSL2 is strongly recommended. Synapse A2A uses
pty.spawn()which requires a Unix-like terminal.
# Inside WSL2 — same as Linux
pipx install synapse-a2a
# Scoop (experimental, WSL2 still required for pty)
scoop bucket add synapse-a2a https://github.com/s-hiraoku/scoop-synapse-a2a
scoop install synapse-a2a
# Install with uv
uv sync
# Or pip (editable)
pip install -e .
With gRPC support:
pip install "synapse-a2a[grpc]"
Installing skills is strongly recommended to get the most out of Synapse A2A.
Skills help Claude automatically understand Synapse A2A features: @agent messaging, File Safety, and more.
# Requires GitHub CLI 2.90.0+
# https://github.blog/changelog/2026-04-16-manage-agent-skills-with-github-cli/
gh skill install s-hiraoku/synapse-a2a synapse-a2a
gh skill install s-hiraoku/synapse-a2a synapse-manager
# Pin a release: gh skill install s-hiraoku/synapse-a2a synapse-a2a --pin v0.26.4
# Target a specific agent runtime: ... --agent claude-code
See Skills for details and
docs/skills-management.md for the full
migration matrix. The legacy npx skills add ... / skills.sh path
still works but is no longer the recommended way to install — use
gh skill install for version pinning and provenance tracking.
# Terminal 1: Claude
synapse claude
# Terminal 2: Codex
synapse codex
# Terminal 3: Gemini
synapse gemini
# Terminal 4: OpenCode
synapse opencode
# Terminal 5: GitHub Copilot CLI
synapse copilot
Note: If terminal scrollback display is garbled, try:
uv run synapse gemini # or uv run python -m synapse.cli gemini
Ports are auto-assigned:
| Agent | Port Range |
|---|---|
| Claude | 8100-8109 |
| Gemini | 8110-8119 |
| Codex | 8120-8129 |
| OpenCode | 8130-8139 |
| Copilot | 8140-8149 |
Use synapse send to send messages between agents. The --from flag is optional -- Synapse auto-detects the sender from SYNAPSE_AGENT_ID (set at startup):
synapse send codex "Please review this design"
synapse send gemini "Suggest API improvements"
For multiple instances of the same type, use type-port format:
synapse send codex-8120 "Handle this task"
synapse send codex-8121 "Handle that task"
# Send message
curl -X POST http://localhost:8100/tasks/send \
-H "Content-Type: application/json" \
-d '{"message": {"role": "user", "parts": [{"type": "text", "text": "Hello!"}]}}'
# Emergency stop (Priority 5)
curl -X POST "http://localhost:8100/tasks/send-priority?priority=5" \
-H "Content-Type: application/json" \
-d '{"message": {"role": "user", "parts": [{"type": "text", "text": "Stop!"}]}}'
While coding with Claude, quickly query Gemini (better at web search) for the latest library specs or error info without context switching.
# In Claude's terminal:
synapse send gemini "Summarize the new f-string features in Python 3.12"
Get feedback on your design from agents with different perspectives.
# After Claude drafts a design:
synapse send gemini "Critically review this design from scalability and maintainability perspectives"
Separate "test writer" and "implementer" for robust code.
# Terminal 1 (Codex):
Create unit tests for auth.py - normal case and token expiration case.
# Terminal 2 (Claude):
synapse send codex-8120 "Implement auth.py to pass the tests you created"
Have an agent with a security expert role audit your code before committing.
# Give Gemini a role:
You are a security engineer. Review only for vulnerabilities (SQLi, XSS, etc.)
# After writing code:
synapse send gemini "Audit the current changes (git diff)"
Pass error logs to an agent for automatic fix suggestions.
# Tests failed...
pytest > error.log
# Ask agent to fix
synapse send claude "Read error.log and fix the issue in synapse/server.py"
Distribute large refactoring work across agents.
# Terminal 1 (Claude):
Read legacy_api.js and create TypeScript type definitions
# Terminal 2 (Codex):
synapse send claude "Use the type definitions you created to rewrite legacy_api.js to src/new_api.ts"
Agents proactively assess when to delegate, spawn helpers, or share knowledge. The collaboration framework encourages cross-model spawning to distribute token usage across providers and avoid rate limits.
# Manager spawns a different model type for a subtask (cross-model preference)
synapse spawn gemini --worktree --name Tester --role "test writer"
# Spawn on a specific branch (--branch auto-enables --worktree)
synapse spawn codex --branch renovate/major-eslint-monorepo --name Fixer --role "dependency updater"
# Spawn + send task in one step (polls for READY then auto-sends)
synapse spawn gemini --worktree --name Tester --role "test writer" \
--task "Write integration tests for auth module" --notify
# Or delegate manually after spawn (prefer --notify over --wait)
synapse send Tester "Write integration tests for auth module" --notify
# Share discoveries via LLM Wiki for all agents to use
synapse wiki ingest docs/auth-pattern.md --scope project
# Merge worktree branch without stopping the agent (integrate intermediate results)
synapse merge Tester
# MANDATORY: Always clean up agents you spawn (worktree branches auto-merge back)
synapse kill Tester -f
# Skip auto-merge if you want to review the branch first
synapse kill Tester -f --no-merge
Key principles:
synapse list first to reuse existing READY agents before spawning new onessynapse kill <name> -f agents you spawned after their work completes. Worktree branches are auto-merged; use --no-merge to skipShare skills, config, or investigation results with agents running in different worktrees. Synapse automatically detects worktree relationships (parent, child, and sibling worktrees of the same repo), so --force is not needed for related worktree agents. Use --message-file for messages containing backticks or code blocks to avoid shell expansion issues.
# Spawn a worker in its own worktree
synapse spawn codex --worktree feature-api --name Cody --role "API implementation"
# Spawn on a non-main base branch (--branch auto-enables --worktree)
synapse spawn codex --worktree feature-api --branch develop --name Cody --role "API implementation"
# Write instructions to a file (avoids shell expansion of backticks)
cat > /tmp/instructions.md << 'EOF'
## /release skill usage
Run `/release patch` to bump the patch version.
EOF
# Send across worktree boundaries (no --force needed for related worktrees)
synapse send Cody --message-file /tmp/instructions.md --silent
Alternatives: --attach sends files without needing --message-file. synapse memory save is directory-agnostic and works across all agents.
| Operation | SSH | Synapse |
|---|---|---|
| Manual CLI operation | ◎ | ◎ |
| Programmatic task submission | △ requires expect etc. | ◎ HTTP API |
| Multiple simultaneous clients | △ multiple sessions | ◎ single endpoint |
| Real-time progress notifications | ✗ | ◎ SSE/Webhook |
| Automatic inter-agent coordination | ✗ | ◎ synapse send |
Note: SSH is often sufficient for individual CLI use. Synapse shines when you need automation, coordination, and multi-agent collaboration.
Installing skills is strongly recommended when using Synapse A2A with Claude Code.
With skills installed, Claude automatically understands and executes:
synapse send codex "Fix this" (sender auto-detected)Install via the GitHub CLI (requires gh 2.90.0+):
# Install core skills from this repository
gh skill install s-hiraoku/synapse-a2a synapse-a2a
gh skill install s-hiraoku/synapse-a2a synapse-manager
# Pin to a release tag so updates are explicit
gh skill install s-hiraoku/synapse-a2a synapse-a2a --pin v0.26.4
# Install for a specific agent runtime
gh skill install s-hiraoku/synapse-a2a synapse-a2a --agent claude-code
gh skill install s-hiraoku/synapse-a2a synapse-a2a --agent copilot
# Preview a skill before installing
gh skill preview s-hiraoku/synapse-a2a synapse-a2a
# Check for upstream changes on installed skills
gh skill update
Each installed skill's SKILL.md frontmatter records the source
repository, ref, and tree SHA, so gh skill update can detect
drift and --pin gives you a deterministic version.
Legacy path — npx skills add s-hiraoku/synapse-a2a
(skills.sh) still works for older gh installs, but gh skill
is the recommended tool going forward. See
docs/skills-management.md for the
migration matrix.
| Skill | Description |
|---|---|
| synapse-a2a | Comprehensive guide for inter-agent communication: synapse send, priority, A2A protocol, history, File Safety, settings |
| synapse-manager | Multi-agent management workflow: task delegation, progress monitoring, quality verification with regression testing, feedback delivery, cross-review orchestration, worker agent guide, and mandatory cleanup enforcement |
| check-ci | Check CI status, merge conflict state, and CodeRabbit review status for the current PR (/check-ci, /check-ci --fix) |
| fix-ci | Auto-diagnose and fix CI failures: lint, format, type-check, test errors |
| fix-conflict | Auto-resolve merge conflicts: fetch base, test merge, analyze both sides, resolve, verify, push |
| fix-review | Auto-fix CodeRabbit review comments: classify by severity (Bug/Style/Suggestion), apply fixes, verify, push |
Core Skills: Essential skills like synapse-a2a are automatically deployed to agent directories on startup (best-effort) to ensure basic quality even if skill sets are skipped.
Synapse includes a built-in skill manager with a central store (~/.synapse/skills/) for organizing and deploying skills across agents.
| Scope | Location | Description |
|---|---|---|
| Synapse | ~/.synapse/skills/ |
Central store (deploy to agents from here) |
| User | ~/.claude/skills/, ~/.agents/skills/, etc. |
User-wide skills |
| Project | ./.claude/skills/, ./.agents/skills/, etc. |
Project-local skills |
| Plugin | ./plugins/*/skills/ |
Read-only plugin skills |
# Interactive TUI
synapse skills
# List and browse
synapse skills list # All scopes
synapse skills list --scope synapse # Central store only
synapse skills show <name> # Skill details
# Manage
synapse skills delete <name> [--force]
synapse skills move <name> --to <scope>
# Central store operations
synapse skills import <name> # Import from agent dirs to ~/.synapse/skills/
synapse skills deploy <name> --agent claude,codex --scope user
synapse skills add <repo> # Install from repo (legacy wrapper; prefer `gh skill install`)
synapse skills create # Show guided skill creation steps
# Skill sets (named groups)
synapse skills set list
synapse skills set show <name>
synapse skills apply <target> <set_name> # Apply skill set to running agent
synapse skills apply <target> <set_name> --dry-run # Preview changes without applying
Synapse ships with 6 built-in skill sets (defined in .synapse/skill_sets.json):
| Skill Set | Description | Skills |
|---|---|---|
| architect | System architecture and design — design docs, API contracts, code review | synapse-a2a, system-design, api-design, code-review, project-docs |
| developer | Implementation and quality — test-first development, refactoring, code simplification | synapse-a2a, test-first, refactoring, code-simplifier, agent-memory |
| reviewer | Code review and security — structured reviews, security audits, code simplification | synapse-a2a, code-review, security-audit, code-simplifier |
| frontend | Frontend development — React/Next.js performance, component composition, design systems, accessibility | synapse-a2a, react-performance, frontend-design, react-composition, web-accessibility |
| manager | Multi-agent management — task delegation, progress monitoring, quality verification, cross-review orchestration, re-instruction | synapse-a2a, synapse-manager, task-planner, agent-memory, code-review, synapse-reinst |
| documentation | Documentation expert — audit, restructure, synchronize, and maintain project documentation | synapse-a2a, project-docs, api-design, agent-memory |
plugins/
└── synapse-a2a/
├── .claude-plugin/plugin.json
├── README.md
└── skills/
├── synapse-a2a/
│ ├── SKILL.md
│ └── references/ # api, collaboration, commands, examples, features, file-safety, messaging, spawning
└── synapse-manager/
├── SKILL.md
├── references/ # auto-approve-flags, commands-quick-ref, features-table, worker-guide
└── scripts/ # wait_ready.sh, check_team_status.sh, regression_triage.sh
See plugins/synapse-a2a/README.md for details.
Note: Codex and Gemini don't support plugins, but you can place expanded skills in the
.agents/skills/directory to enable these features.
.synapse configuration detailsIn Synapse, each agent operates as an A2A server. There's no central server; it's a P2P architecture.
┌─────────────────────────────────────┐ ┌─────────────────────────────────────┐
│ synapse claude (port 8100) │ │ synapse codex (port 8120) │
│ ┌───────────────────────────────┐ │ │ ┌───────────────────────────────┐ │
│ │ FastAPI Server (A2A Server) │ │ │ │ FastAPI Server (A2A Server) │ │
│ │ /.well-known/agent.json │ │ │ │ /.well-known/agent.json │ │
│ │ /tasks/send │◄─┼────┼──│ A2AClient │ │
│ │ /tasks/{id} │ │ │ └───────────────────────────────┘ │
│ └───────────────────────────────┘ │ │ ┌───────────────────────────────┐ │
│ ┌───────────────────────────────┐ │ │ │ PTY + Codex CLI │ │
│ │ PTY + Claude CLI │ │ │ └───────────────────────────────┘ │
│ └───────────────────────────────┘ │ └─────────────────────────────────────┘
└─────────────────────────────────────┘
Each agent is:
| Component | File | Role |
|---|---|---|
| FastAPI Server | synapse/server.py |
Provides A2A endpoints |
| A2A Router | synapse/a2a_compat.py |
A2A protocol endpoints and PTY bridging |
| A2A Models | synapse/a2a_models.py |
Pydantic data models for A2A messages and tasks |
| TaskStore | synapse/task_store.py |
In-memory task persistence and status tracking |
| A2A Client | synapse/a2a_client.py |
Communication with other agents |
| TerminalController | synapse/controller.py |
PTY management, READY/PROCESSING detection |
| Shell | synapse/shell.py |
Interactive shell with @Agent pattern routing |
| AgentRegistry | synapse/registry.py |
Agent registration and lookup |
| Worktree | synapse/worktree.py |
Synapse-native git worktree isolation for all agents |
| FileSafety | synapse/file_safety.py |
Multi-agent file locking and change tracking |
| SkillManager | synapse/skills.py |
Skill discovery, deploy, import, skill sets |
| Commands | synapse/commands/ |
CLI command handlers (extracted from cli.py) |
| SkillManagerCmd | synapse/commands/skill_manager.py |
Skill management TUI and CLI |
| AgentProfileStore | synapse/agent_profiles.py |
Saved agent definitions (reusable templates for spawn) |
| WorkflowRunDB | synapse/workflow_db.py |
SQLite persistence for workflow execution history |
| WorkflowRunner | synapse/workflow_runner.py |
Step-by-step workflow executor |
| Observation | synapse/observation.py |
PTY/A2A signal capture for self-learning pipeline |
| PatternAnalyzer | synapse/pattern_analyzer.py |
Observation pattern analysis |
| Instinct | synapse/instinct.py |
Learned instinct persistence |
| Transport | synapse/transport.py |
Transport abstraction layer |
| Canvas | synapse/canvas/ |
Shared visual output surface (server, protocol, store, export, routes) |
| Patterns | synapse/patterns/ |
Multi-agent coordination patterns (base, store, runner) |
| MultiagentCmd | synapse/commands/multiagent.py |
CLI handlers for synapse multiagent / synapse map |
| MCP Server | synapse/mcp/ |
MCP bootstrap resource server (instructions, settings, agent card) |
sequenceDiagram
participant Synapse as Synapse Server
participant Registry as AgentRegistry
participant PTY as TerminalController
participant CLI as CLI Agent
Synapse->>Registry: 1. Register agent (agent_id, pid, port)
Synapse->>PTY: 2. Start PTY
PTY->>CLI: 3. Start CLI agent
Synapse->>PTY: 4. Send minimal bootstrap message (sender: synapse-system)
PTY->>CLI: 5. AI retrieves system context via Agent Card (x-synapse-context)
sequenceDiagram
participant User
participant Claude as Claude (8100)
participant Client as A2AClient
participant Codex as Codex (8120)
User->>Claude: @codex Review this design
Claude->>Client: send_to_local()
Client->>Codex: POST /tasks/send-priority
Codex->>Codex: Create Task → Write to PTY
Codex-->>Client: {"task": {"id": "...", "status": "working"}}
Client-->>Claude: [→ codex] Send complete
# Start agent (foreground)
synapse claude
synapse codex
synapse gemini
synapse opencode
synapse copilot
# Start with custom name and role
synapse claude --name my-claude --role "code reviewer"
# Start with saved agent definition (--agent / -A)
synapse claude --agent calm-lead
synapse claude -A Claud # Short flag, lookup by display name
# Skip interactive name/role setup
synapse claude --no-setup
# Specify port
synapse claude --port 8105
# Pass arguments to CLI tool
synapse claude -- --resume
Assign custom names and roles to agents for easier identification and management:
# Interactive setup (default when starting agent)
synapse claude
# → Prompts for name and role
# Skip interactive setup
synapse claude --no-setup
# Set name and role via CLI options
synapse claude --name my-claude --role "code reviewer"
# Load role from file (@prefix reads file content)
synapse claude --name reviewer --role "@./roles/reviewer.md"
# Use saved agent definition (--agent / -A)
synapse claude --agent calm-lead
synapse claude -A Claud # Short flag
# After agent is running, change name/role
synapse rename synapse-claude-8100 --name my-claude --role "test writer"
synapse rename my-claude --role "documentation" # Change role only
synapse rename my-claude --clear # Clear name and role
Once named, use the custom name for all operations:
synapse send my-claude "Review this code"
synapse jump my-claude
synapse kill my-claude
Name vs ID:
Kill my-claude (PID: 1234)?)synapse-claude-8100)When an interactive agent session exits, Synapse can prompt to save the current
agent definition for reuse:
Save this agent definition for reuse? [y/N]:
synapse <profile> sessions with a configured name.--headless mode or non-TTY environments.synapse stop ... or synapse kill ... (those commands only stop running processes).project, but switches to user when the session is running inside a worktree (issue #410). The prompt makes this explicit (default: user - project scope in a worktree is deleted on cleanup). When a worktree is cleaned up, any *.agent files saved under <worktree>/.synapse/agents/ are also copied back to the main repo's .synapse/agents/ as a safety net (main repo files win on collision).SYNAPSE_AGENT_SAVE_PROMPT_ENABLED=false.| Command | Description |
|---|---|
synapse <profile> |
Start in foreground |
synapse start <profile> |
Start in background |
synapse stop <profile|id> |
Stop agent (can specify ID) |
synapse kill <target> |
Graceful shutdown (sends shutdown request, then SIGTERM after 30s). Auto-merges worktree branch |
synapse kill <target> -f |
Force kill (immediate SIGKILL). Auto-merges worktree branch |
synapse kill <target> --no-merge |
Kill without auto-merging worktree branch |
synapse cleanup |
Kill orphan agents (children whose spawned_by parent crashed/cleared). --dry-run to preview, -f to skip prompt, optional positional agent id to target one. Set SYNAPSE_ORPHAN_IDLE_TIMEOUT=<sec> to opt into opportunistic cleanup of long-READY orphans on synapse list |
synapse merge <agent> |
Merge worktree branch without killing the agent. --all for all agents, --dry-run to preview |
synapse jump <target> |
Jump to agent's terminal |
synapse rename <target> |
Assign name/role to agent |
synapse set-summary <target> [text] |
Set persistent agent summary (120 chars). --auto generates from git context, --clear removes |
synapse --version |
Show version |
synapse list |
List running agents (Rich TUI in alternate screen with auto-refresh and terminal jump) |
synapse list --plain |
Force one-shot plain-text output without entering the TUI |
synapse list --json |
Output agent list as JSON array (for AI/programmatic consumption) |
synapse status <target> |
Show detailed agent status (info, current task, history, file locks). Supports --json |
synapse logs <profile> |
Show logs |
synapse send <target> <message> |
Send message |
synapse interrupt <target> <message> |
Soft interrupt (shorthand for send -p 4 --silent). Supports --force to bypass working_dir check |
synapse reply [<message> | --fail <reason>] |
Reply to the last received A2A message (use --fail for failure) |
synapse trace <task_id> |
Show task history + file-safety cross-reference |
synapse instructions show |
Show instruction content |
synapse instructions files |
List instruction files |
synapse instructions send |
Resend initial instructions |
synapse history list |
Show task history |
synapse history show <task_id> |
Show task details |
synapse history search |
Keyword search |
synapse history cleanup |
Delete old data |
synapse history stats |
Show statistics |
synapse history export |
Export to JSON/CSV |
synapse file-safety status |
Show file safety statistics |
synapse file-safety locks |
List active locks |
synapse file-safety lock |
Lock a file |
synapse file-safety unlock |
Release lock |
synapse file-safety history |
File change history |
synapse file-safety recent |
Recent changes |
synapse file-safety record |
Manually record change |
synapse file-safety cleanup |
Delete old data |
synapse file-safety debug |
Show debug info |
synapse skills |
Skill Manager (interactive TUI) |
synapse skills list |
List discovered skills |
synapse skills show <name> |
Show skill details |
synapse skills delete <name> |
Delete a skill |
synapse skills move <name> |
Move skill to another scope |
synapse skills deploy <name> |
Deploy skill from central store to agent dirs |
synapse skills import <name> |
Import skill to central store (~/.synapse/skills/) |
synapse skills add <repo> |
Install skill from repository (legacy wrapper; prefer gh skill install <repo> <skill>) |
synapse skills create [name] |
Create new skill template |
synapse skills set list |
List skill sets |
synapse skills set show <name> |
Show skill set details |
synapse skills apply <target> <set_name> |
Apply skill set to running agent (--dry-run to preview) |
synapse config |
Settings management (interactive TUI) |
synapse config show |
Show current settings |
synapse doctor |
Run health checks; also detects orphan port listeners in the managed range and stale UDS sockets |
synapse doctor --clean |
Terminate orphan listeners and remove stale sockets (prompts per orphan; -y to skip prompts) |
synapse doctor --strict |
Exit 1 when orphan listeners or stale sockets are present (for CI / scripts) |
synapse worktree prune |
Remove orphan worktrees whose directories no longer exist but whose git refs remain |
synapse approve <task_id> |
Approve a plan |
synapse reject <task_id> |
Reject a plan with reason |
synapse team start |
Launch agents (1st=handoff, rest=new panes). Defaults to --worktree isolation; opt out with --no-worktree. --all-new for all new panes |
synapse spawn <profile|saved-agent> |
Spawn a single agent in a new terminal pane. Auto-tiles panes when 2+ agents are spawned. Accepts saved agent IDs/names. --worktree / -w for Synapse-native worktree isolation (all agents). --branch / -b auto-enables --worktree and sets the base branch (default: origin/main). --no-worktree to opt out. --task "msg" / --task-file path to auto-send a task after READY. Recommended: --task-file <path> --task-timeout 600 --notify |
synapse merge <agent> |
Merge a worktree agent's branch into the current branch. --all to merge all worktree agents. --dry-run to preview. --resolve-with <agent> to delegate conflict resolution (Phase 2) |
synapse agents list |
List saved agent definitions |
synapse agents show <id_or_name> |
Show details for a saved agent |
synapse agents add <id> |
Add or update a saved agent definition (requires --name, --profile) |
synapse agents delete <id_or_name> |
Delete a saved agent by ID or name |
synapse session save <name> |
Save running agents as a named session snapshot (captures session_id for resume) |
synapse session list |
List saved sessions |
synapse session show <name> |
Show session details (includes session_id per agent) |
synapse session restore <name> |
Restore a saved session (spawns agents). Use --resume to resume each agent's CLI conversation |
synapse session delete <name> |
Delete a saved session |
synapse workflow create <name> |
Create a workflow template YAML |
synapse workflow list |
List saved workflows |
synapse workflow show <name> |
Show workflow details |
synapse workflow run <name> |
Execute workflow steps sequentially (--dry-run to preview, --async for background execution returning a run_id) |
synapse workflow status <run_id> |
Show workflow run status |
synapse workflow sync |
Re-generate skills from all workflow YAMLs (removes orphans) |
synapse workflow delete <name> |
Delete a saved workflow |
synapse mcp serve |
Start MCP bootstrap server over stdio (options auto-resolved from $SYNAPSE_AGENT_ID). Exposes bootstrap_agent, list_agents, and analyze_task tools |
synapse canvas serve |
Start Canvas server (auto-opens browser, port 3000). --no-open to suppress browser open |
synapse canvas status |
Show Canvas server status (version, PID, asset hash match, STALE warning) |
synapse canvas stop |
Stop Canvas server (health-check with identity + process verification, SIGKILL escalation, PID fallback). --port/-p to specify port |
synapse canvas restart |
Restart Canvas server on the same port (stop + serve). --no-open to skip browser open. Use this to pick up updated HTML/JS assets that are cached at startup |
synapse canvas mermaid <body> |
Post Mermaid diagram card |
synapse canvas markdown <body> |
Post Markdown card |
synapse canvas table <json> |
Post table card |
synapse canvas chart <json> |
Post Chart.js card |
synapse canvas code <body> |
Post syntax-highlighted code card |
synapse canvas html <body> |
Post raw HTML card (sandboxed iframe with theme sync, auto-resize, and full document normalization) |
synapse canvas diff <body> |
Post side-by-side diff card |
synapse canvas image <url> |
Post image card |
synapse canvas briefing <json> |
Post briefing template card (structured report with sections). Supports --file |
synapse canvas plan <json> |
Post Plan Card template (Mermaid DAG + step list with status tracking). Supports --file. See Smart Suggest Design |
synapse canvas post-raw <json> |
Post raw Canvas Message Protocol JSON (supports all templates, typed bodies, and block-level metadata such as x_title / x_filename) |
synapse canvas post progress <json> |
Post progress bar card ({current, total, label, steps, status}) |
synapse canvas post terminal <string> |
Post terminal output card (supports ANSI escape codes) |
synapse canvas post dependency-graph <json> |
Post dependency graph card ({nodes, edges}, rendered via Mermaid) |
synapse canvas post cost <json> |
Post token/cost aggregation table ({agents, total_cost, currency}) |
synapse canvas link <url> |
Post link preview card (OGP-enriched embed with title, description, image) |
synapse canvas list |
List cards (--mine, --search, --type) |
synapse canvas delete <card_id> |
Delete a card |
synapse canvas clear |
Clear all cards (--agent to filter) |
synapse learn |
Analyze observations and persist learned instincts |
synapse instinct |
List learned instincts (filters: --scope, --domain, --min-confidence) |
synapse instinct promote <id> |
Promote a project-scoped instinct to global scope |
synapse evolve |
Discover skill candidates from learned instincts (--generate to write skill files) |
synapse multiagent init <type> |
Create a new multi-agent pattern template YAML. Types: generator-verifier, orchestrator-subagent, agent-teams, message-bus, shared-state. --name, --user for user scope, --force to overwrite |
synapse multiagent list |
List saved multi-agent patterns (--user / --project to filter scope) |
synapse multiagent show <name> |
Show pattern YAML details |
synapse multiagent run <name> <task> |
Execute a saved pattern (--dry-run to preview, --async for background) |
synapse multiagent status <run_id> |
Show status of a pattern run |
synapse multiagent stop <run_id> |
Stop a running pattern execution |
synapse map |
Alias for synapse multiagent |
When resuming an existing session, use these flags to skip initial instruction sending (A2A protocol explanation), keeping your context clean:
# Resume Claude Code session
synapse claude -- --resume
# Resume Gemini with history
synapse gemini -- --resume=5
# Codex uses 'resume' as a subcommand (not --resume flag)
synapse codex -- resume --last
Default flags (customizable in settings.json):
--resume, --continue, -r, -c--resume, -rresume--continue, -c--continue, --resumeManually resend initial instructions when they weren't sent (e.g., after --resume mode):
# Show instruction content
synapse instructions show claude
# List instruction files
synapse instructions files claude
# Send initial instructions to running agent
synapse instructions send claude
# Preview before sending
synapse instructions send claude --preview
# Send to specific Runtime ID
synapse instructions send synapse-claude-8100
Useful when:
--resume# Register external agent
synapse external add http://other-agent:9000 --alias other
# List
synapse external list
# Send message
synapse external send other "Process this task"
Search, browse, and analyze past agent execution results.
Note: History is enabled by default since v0.3.13. To disable:
# Disable via environment variable
export SYNAPSE_HISTORY_ENABLED=false
synapse claude
# Show latest 50 entries
synapse history list
# Filter by agent
synapse history list --agent claude
# Custom limit
synapse history list --limit 100
# Show task details
synapse history show task-id-uuid
Search input/output fields by keyword:
# Single keyword
synapse history search "Python"
# Multiple keywords (OR logic)
synapse history search "Python" "Docker"
# AND logic (all keywords must match)
synapse history search "Python" "function" --logic AND
# With agent filter
synapse history search "Python" --agent claude
# Limit results
synapse history search "error" --limit 20
# Overall stats (total, success rate, per-agent breakdown)
synapse history stats
# Specific agent stats
synapse history stats --agent claude
When token usage data is available (collected via synapse/token_parser.py), synapse history stats displays a TOKEN USAGE section with aggregated input/output tokens and estimated cost per agent.
# JSON export (stdout)
synapse history export --format json
# CSV export
synapse history export --format csv
# Save to file
synapse history export --format json --output history.json
synapse history export --format csv --agent claude > claude_history.csv
# Delete data older than 30 days
synapse history cleanup --days 30
# Keep database under 100MB
synapse history cleanup --max-size 100
# Force (no confirmation)
synapse history cleanup --days 30 --force
# Dry run
synapse history cleanup --days 30 --dry-run
Storage:
~/.synapse/history/history.db (user-global)Settings:
SYNAPSE_HISTORY_ENABLED=falseUse synapse send for inter-agent communication. Works in sandboxed environments.
synapse send <target> "<message>" [--from <sender>] [--priority <1-5>] [--wait | --notify | --silent]
Target Formats:
| Format | Example | Description |
|---|---|---|
| Custom name | my-claude |
Highest priority, match name in registry |
| Full Runtime ID | synapse-claude-8100 |
Match exact Runtime ID |
| Type-port | claude-8100 |
Match type and port shorthand |
| Agent type | claude |
Only works when single instance of type exists |
When multiple agents of the same type are running, type-only (e.g., claude) will error. Use claude-8100 or synapse-claude-8100.
Options:
| Option | Short | Description |
|---|---|---|
--from |
-f |
Sender Runtime ID (optional; auto-detected from SYNAPSE_AGENT_ID) |
--priority |
-p |
Priority 1-4: normal, 5: emergency stop (sends SIGINT) |
--message-file |
-F |
Read message from a file (- for stdin). Skips shell-expansion warnings for backticks/code blocks |
--task-file |
-T |
Read message from a task file (- for stdin). Equivalent to --message-file; use when the content is a task specification (Markdown, etc.) |
--stdin |
- | Read message from stdin |
--wait |
- | Synchronous blocking - wait for receiver to reply with synapse reply |
--notify |
- | Async notification - get notified when task completes (default) |
--silent |
- | Fire and forget - no reply or notification needed |
--force |
- | Bypass working directory mismatch check (only needed for truly different projects; worktree agents of the same repo are auto-detected) |
Message sources: Exactly one of positional message, --message-file, --task-file, or --stdin must be supplied. File/stdin inputs bypass the shell, so messages containing backticks, code fences, or long Markdown no longer trigger false shell-expansion warnings.
--wait and --notify spawn a sender-side task that produces structured A2A reply artifacts derived from the PTY output delta captured since task start. Synapse uses this delta, not the raw terminal tail, to reduce status-line noise in replies. TUI response cleaning (clean_copilot_response()) now runs for all agents, stripping Ink TUI artifacts (spinners, box-drawing borders, status bar, input echo) before finalization. In server mode, startup/runtime logs stay off stderr so they do not leak into the agent TUI. Quota-exhaustion output such as 402 You have no quota is classified as a failed task instead of a normal reply.
PROCESSING wait: When the target agent is in PROCESSING state, synapse send automatically waits up to 30 seconds for the agent to become idle before delivering the message. This prevents message loss when an agent is busy. The wait is skipped for --force, priority 5 (emergency), and --silent sends.
Choosing response mode:
| Message Type | Flag | Example |
|---|---|---|
| Question | --wait |
"What is the status?" |
| Request for analysis | --wait |
"Please review this code" |
| Task with result expected | --notify |
"Run tests and report the results" |
| Delegated task (fire-and-forget) | --silent |
"Fix this bug and commit" |
| Notification | --silent |
"FYI: Build completed" |
Default is --notify (async notification on completion).
Working directory check: synapse send verifies that the sender's current working directory matches the target agent's working_dir. Worktree relationships are automatically detected — parent repo, child worktree, and sibling worktrees of the same repo are all allowed without --force. For truly different projects, a warning is shown with available agents in the current directory (or a synapse spawn suggestion) and the command exits with code 1. Use --force to bypass this check.
Examples:
# Task with result expected (async notification - default)
synapse send gemini "Analyze this and report findings" --notify
# Task with immediate response (blocking)
synapse send gemini "What is the best approach?" --wait
# Delegated task, fire-and-forget
synapse send codex "Fix this bug and commit" --silent
# Send message (single instance; --from auto-detected)
synapse send claude "Hello" --priority 1
# Long message support (automatic temp-file fallback)
synapse send claude --message-file /path/to/message.txt --silent
synapse send claude --task-file /path/to/tasks/auth.md --notify # alias for --message-file (task-specification intent)
synapse send claude -T /path/to/tasks/auth.md --notify # -T short form
echo "very long content..." | synapse send claude --stdin --silent
# File attachments
synapse send claude "Review this" --attach src/main.py --wait
# Send to specific instance (multiple of same type)
synapse send claude-8100 "Hello"
# Emergency stop
synapse send claude "Stop!" --priority 5
# Bypass working directory mismatch check (only needed for different projects)
synapse send claude "Review this" --force
# Explicit --from (only needed in sandboxed environments like Codex)
synapse send claude "Hello" --from $SYNAPSE_AGENT_ID
Default behavior: With a2a.flow=auto (default), synapse send uses --notify mode — the command returns immediately and you receive a PTY notification when the receiver completes. Use --wait for synchronous blocking, or --silent for fire-and-forget (no completion notification).
Sender auto-detection: --from is optional. Synapse auto-detects the sender using SYNAPSE_AGENT_ID (set at startup), then falls back to PID matching (process ancestry). Use explicit --from only in sandboxed environments (like Codex) where env vars may not propagate. If the sender cannot be identified, Synapse prints Warning: Could not identify sender agent. Set SYNAPSE_AGENT_ID or use --from. and the outbound message has an empty sender field — set SYNAPSE_AGENT_ID or pass --from to fix it.
Troubleshooting delivery failures: If synapse send prints Error sending message: local send failed, re-run with SYNAPSE_LOG_LEVEL=DEBUG to see UDS/TCP failure details, HTTP status codes, and endpoint information. Common causes include an HTTP 409 Agent busy (working task) when the target is mid-task (use synapse status <target> to check, or -p 5 to interrupt), or the target agent being unreachable on its local socket.
Reply to the last received message:
synapse reply "<message>"
synapse reply --fail "reason for failure" # Send a failed reply
The --from flag is only needed in sandboxed environments (like Codex). Without --from, Synapse auto-detects the sender. Use --fail to indicate the task could not be completed; this sends a failed status with an error instead of a normal text reply.
For advanced operations:
# List agents
python -m synapse.tools.a2a list
# Send message
python -m synapse.tools.a2a send --target claude --priority 1 "Hello"
# Reply to last received message (uses reply tracking)
python -m synapse.tools.a2a reply "Here is my response"
| Endpoint | Method | Description |
|---|---|---|
/.well-known/agent.json |
GET | Agent Card |
/tasks/send |
POST | Send message |
/tasks/send-priority |
POST | Send with priority |
/tasks/create |
POST | Create task (no PTY send, for --wait) |
/tasks/{id} |
GET | Get task status |
/tasks |
GET | List tasks |
/tasks/{id}/cancel |
POST | Cancel task |
/status |
GET | READY/PROCESSING status |
Readiness Gate:
/tasks/sendand/tasks/send-priorityreturn HTTP 503 (withRetry-After: 5) until the agent finishes initialization (identity instruction sending). Priority 5 (emergency interrupt) and reply messages bypass this gate. See CLAUDE.md for details.
| Endpoint | Method | Description |
|---|---|---|
/tasks/{id}/approve |
POST | Approve a plan |
/tasks/{id}/reject |
POST | Reject a plan with reason |
/team/start |
POST | Start multiple agents in terminal panes (A2A-initiated) |
/spawn |
POST | Spawn a single agent in a new terminal pane (A2A-initiated) |
| Endpoint | Method | Description |
|---|---|---|
/reply-stack/get |
GET | Get sender info without removing (for peek before send) |
/reply-stack/pop |
GET | Pop sender info from reply map (for synapse reply) |
/tasks/{id}/subscribe |
GET | Subscribe to task updates via SSE |
| Endpoint | Method | Description |
|---|---|---|
/webhooks |
POST | Register a webhook for task notifications |
/webhooks |
GET | List registered webhooks |
/webhooks |
DELETE | Unregister a webhook |
/webhooks/deliveries |
GET | Recent webhook delivery attempts |
| Endpoint | Method | Description |
|---|---|---|
/external/discover |
POST | Register external agent |
/external/agents |
GET | List |
/external/agents/{alias} |
DELETE | Remove |
/external/agents/{alias}/send |
POST | Send |
In the A2A protocol, all communication is managed as Tasks.
stateDiagram-v2
[*] --> submitted: POST /tasks/send
submitted --> working: Processing starts
working --> completed: Success
working --> failed: Error
working --> input_required: Waiting for input
input_required --> working: Input received
completed --> [*]
failed --> [*]
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"context_id": "conversation-123",
"status": "working",
"message": {
"role": "user",
"parts": [{ "type": "text", "text": "Review this design" }]
},
"artifacts": [],
"metadata": {
"sender": {
"sender_id": "synapse-claude-8100",
"sender_type": "claude",
"sender_endpoint": "http://localhost:8100"
}
},
"created_at": "2024-01-15T10:30:00Z",
"updated_at": "2024-01-15T10:30:05Z"
}
| Field | Type | Description |
|---|---|---|
id |
string | Unique task identifier (UUID) |
context_id |
string? | Conversation context ID (for multi-turn) |
status |
string | submitted / working / completed / failed / input_required |
message |
Message | Sent message |
artifacts |
Artifact[] | Task output artifacts |
metadata |
object | Sender info (metadata.sender) |
created_at |
string | Creation timestamp (ISO 8601) |
updated_at |
string | Update timestamp (ISO 8601) |
{
"role": "user",
"parts": [
{ "type": "text", "text": "Message content" },
{
"type": "file",
"file": {
"name": "doc.pdf",
"mimeType": "application/pdf",
"bytes": "..."
}
}
]
}
| Part Type | Description |
|---|---|
text |
Text message |
file |
File attachment |
data |
Structured data |
The sender of A2A messages can be identified via metadata.sender.
Messages are sent to the agent's PTY with a prefix that includes optional sender identification and reply expectations:
A2A: [From: NAME (SENDER_ID)] [REPLY EXPECTED] <message content>
If sender information is not available, it falls back to:
A2A: [From: SENDER_ID] <message content>A2A: <message content> (backward compatible format)Synapse automatically manages reply routing. Agents simply use synapse reply:
synapse reply "Here is my response"
The framework internally tracks sender information and routes replies automatically.
curl -s http://localhost:8120/tasks/<id> | jq '.metadata.sender'
Response:
{
"sender_id": "synapse-claude-8100",
"sender_type": "claude",
"sender_endpoint": "http://localhost:8100"
}
metadata.sender| Priority | Behavior | Use Case |
|---|---|---|
| 1-4 | Normal stdin write | Regular messages |
| 5 | SIGINT then write | Emergency stop |
# Emergency stop
synapse send claude "Stop!" --priority 5
Each agent publishes an Agent Card at /.well-known/agent.json.
curl http://localhost:8100/.well-known/agent.json
{
"name": "Synapse Claude",
"description": "PTY-wrapped claude CLI agent with A2A communication",
"url": "http://localhost:8100",
"capabilities": {
"streaming": false,
"pushNotifications": false,
"multiTurn": true
},
"skills": [
{
"id": "chat",
"name": "Chat",
"description": "Send messages to the CLI agent"
},
{
"id": "interrupt",
"name": "Interrupt",
"description": "Interrupt current processing"
}
],
"extensions": {
"synapse": {
"agent_id": "synapse-claude-8100",
"pty_wrapped": true,
"priority_interrupt": true,
"at_agent_syntax": true,
"summary": "Working on auth refactor"
},
"x-synapse-context": {
"identity": "synapse-claude-8100",
"routing_rules": {
"self_patterns": ["@synapse-claude-8100", "@claude"],
"forward_command": "synapse send <agent_id> \"<message>\" --from <your_agent_id>"
},
"available_agents": [
{ "id": "synapse-gemini-8110", "type": "gemini", "endpoint": "http://localhost:8110", "status": "READY" }
]
}
}
}
To keep the PTY clean, Synapse uses the x-synapse-context extension to pass system context to agents. The PTY receives a minimal bootstrap message:
[SYNAPSE A2A] Your ID: synapse-claude-8100
Retrieve your system context:
curl -s http://localhost:8100/.well-known/agent.json | python3 -c "import sys,json; d=json.load(sys.stdin); print(json.dumps(d.get('extensions', {}).get('x-synapse-context', {}), indent=2))"
AI agents execute this command to discover themselves and their peers.
Agent Card is a "business card" containing only external-facing information:
x-synapse-context): Includes system context (ID, routing rules, other agents) and bootstrap instructions, keeping the PTY clean.x-synapse-context or initial Task).~/.a2a/registry/
├── synapse-claude-8100.json
├── synapse-claude-8101.json
└── synapse-gemini-8110.json
~/.a2a/reply/
└── synapse-claude-8100.reply.json # Reply target persistence (auto-cleaned)
Stale entries are automatically removed during:
synapse list executionPORT_RANGES = {
"claude": (8100, 8109),
"gemini": (8110, 8119),
"codex": (8120, 8129),
"opencode": (8130, 8139),
"copilot": (8140, 8149),
"dummy": (8190, 8199),
}
On macOS, idle resident agents are lightweight. As of January 25, 2026,
RSS is around ~12 MB per agent process in a typical development setup.
Actual usage varies by profile, plugins, history settings, and workload.
Note that ps reports RSS in KB (so ~12 MB corresponds to ~12,000 KB).
To measure on your machine:
ps -o pid,comm,rss,vsz,etime,command -A | rg "synapse"
If you don't have ripgrep:
ps -o pid,comm,rss,vsz,etime,command -A | grep "synapse"
Prevents conflicts when multiple agents edit the same files simultaneously.
sequenceDiagram
participant Claude
participant FS as File Safety
participant Gemini
Claude->>FS: acquire_lock("auth.py")
FS-->>Claude: ACQUIRED
Gemini->>FS: validate_write("auth.py")
FS-->>Gemini: DENIED (locked by claude)
Claude->>FS: release_lock("auth.py")
Gemini->>FS: acquire_lock("auth.py")
FS-->>Gemini: ACQUIRED
| Feature | Description |
|---|---|
| File Locking | Exclusive control prevents simultaneous editing |
| Change Tracking | Records who changed what and when |
| Context Injection | Provides recent change history on read |
| Pre-write Validation | Checks lock status before writing |
| List Integration | Active locks visible in synapse list EDITING_FILE column |
# Enable via environment variable
export SYNAPSE_FILE_SAFETY_ENABLED=true
synapse claude
# Show statistics
synapse file-safety status
# List active locks
synapse file-safety locks
# Acquire lock
synapse file-safety lock /path/to/file.py claude --intent "Refactoring"
# Wait for lock to be released
synapse file-safety lock /path/to/file.py claude --wait --wait-timeout 60 --wait-interval 2
# Release lock
synapse file-safety unlock /path/to/file.py claude
# File change history
synapse file-safety history /path/to/file.py
# Recent changes
synapse file-safety recent
# Delete old data
synapse file-safety cleanup --days 30
from synapse.file_safety import FileSafetyManager, ChangeType, LockStatus
manager = FileSafetyManager.from_env()
# Acquire lock
result = manager.acquire_lock("/path/to/file.py", "claude", intent="Refactoring")
if result["status"] == LockStatus.ACQUIRED:
# Edit file...
# Record change
manager.record_modification(
file_path="/path/to/file.py",
agent_name="claude",
task_id="task-123",
change_type=ChangeType.MODIFY,
intent="Fix authentication bug"
)
# Release lock
manager.release_lock("/path/to/file.py", "claude")
# Pre-write validation
validation = manager.validate_write("/path/to/file.py", "gemini")
if not validation["allowed"]:
print(f"Write blocked: {validation['reason']}")
Storage: Default is .synapse/file_safety.db (SQLite, relative to working directory). Change via SYNAPSE_FILE_SAFETY_DB_PATH (e.g., ~/.synapse/file_safety.db for global).
See docs/file-safety.md for details.
Real-time monitoring of agent status with terminal jump capability.
# Start Rich TUI in the alternate screen with auto-refresh (default)
synapse list
# JSON output for AI/programmatic consumption
synapse list --json
The display automatically updates when agent status changes (via file watcher) with a 10-second fallback polling interval.
synapse list --json outputs a JSON array of agent objects for AI and scripting use. Each object includes: agent_id, agent_type, name, role, skill_set, port, status, pid, working_dir, endpoint, transport, current_task_preview, task_received_at, summary, and optionally editing_file.
If automation is attached to a TTY, use synapse list --json, synapse list --plain, or set SYNAPSE_NONINTERACTIVE=1. Bare synapse list is intended for human-operated interactive terminals.
For Copilot specifically, bracketed paste is enabled because Copilot CLI 1.0.12+ enables bracketed paste mode (ESC[?2004h). Synapse wraps input in paste markers so Ink routes it through usePaste as a single atomic event, which also eliminates the need for slash-command escaping. Input is delivered through an inject pipe mechanism that merges keyboard input and programmatic writes into the PTY's _copy loop, solving the issue where direct writes from other threads were lost. An input_ready_pattern (❯) detects when the TUI is ready before sending instructions. Long messages use a single-line file reference format. Bounded submit confirmation verifies that Copilot cleared the prompt after submission. Copilot CLI also enables Kitty Keyboard Protocol (KKP) on startup, which re-encodes Enter from \r to CSI 13 u, causing injected \r submits to be silently ignored. Synapse detects KKP activation in PTY output and immediately pops the mode, and also proactively disables KKP before the first submit as a safety net.
| Column | Description |
|---|---|
| ID | Runtime ID (e.g., synapse-claude-8100) |
| NAME | Custom name (if assigned) |
| TYPE | Agent type (claude, gemini, codex, etc.) |
| ROLE | Agent role description (if assigned) |
| STATUS | Current status (READY, WAITING, PROCESSING, DONE) |
| CURRENT | Current task preview with elapsed time (e.g., "Review code (2m 15s)") |
| TRANSPORT | Communication transport indicator |
| WORKING_DIR | Current working directory |
| SKILL_SET | Applied skill set name (if any) |
| SUMMARY | Persistent agent summary (opt-in, not in default columns) |
| EDITING_FILE | File being edited (File Safety enabled only) |
Customize columns in settings.json:
{
"list": {
"columns": ["ID", "NAME", "STATUS", "CURRENT", "TRANSPORT", "WORKING_DIR"]
}
}
| Status | Color | Meaning |
|---|---|---|
| READY | Green | Agent is idle, waiting for input |
| WAITING | Cyan | Agent is showing selection UI, waiting for user choice |
| PROCESSING | Yellow | Agent is actively working |
| DONE | Blue | Task completed (auto-transitions to READY after 10s) |
| Key | Action |
|---|---|
| 1-9 | Select agent row (direct) |
| ↑/↓ | Navigate agent rows |
| Enter or j | Jump to selected agent's terminal |
| K | Kill selected agent (with confirmation) |
| / | Filter by TYPE, NAME, or WORKING_DIR |
| ESC | Clear filter/selection |
| q | Quit |
Supported Terminals: iTerm2, Terminal.app, Ghostty, VS Code, tmux, Zellij
WAITING detection is enabled in all five profiles (claude, codex, gemini, opencode, copilot). The #140 false positive issue was resolved by matching only against fresh PTY output (new_data) and adding auto-expiry (waiting_expiry, default 10s) with buffer tail re-check. As of #572, the waiting_detection regex is evaluated against a pyte-backed virtual terminal (synapse/pty_renderer.py) that replays cursor-motion CSI sequences in place, so TUI-based agents (ratatui, Ink, Bubble Tea) that overwrite the same cells are matched against the text a human actually sees rather than an ANSI-stripped byte stream. Alt-screen buffer (\x1b[?1049h/l) enter/leave is tracked, and a new GET /debug/pty endpoint on each per-agent A2A server returns the rendered screen as JSON ({display, cursor, alt_screen, columns, rows}) for debugging regex matches.
Detects agents waiting for user input (selection UI, Y/n prompts) using agent-specific regex patterns:
❯ Option cursor, ☐/☑ checkboxes, [Y/n] prompts● 1. Option selection UI, Action Required header, Allow once/for this session/for this file, No, suggest changes, Apply this change, Do you want to proceed› selector with numbered items, Yes, proceed, Yes, and don't ask again, No, and tell Codex, Press enter to confirm, Press [Ee]nter to confirm, Would you like toPermission Required header, horizontal button bar (Allow (a), Allow for session (s), Deny (d))[y/N] or (y/n) prompts, approve ... for the rest of the running session, No, and tell Copilot. A repeated WAITING state only confirms after the prompt text clears.The PROCESSING to READY transition uses compound signals to prevent premature detection during A2A task processing:
task_active flag: Suppresses READY when an A2A task is being processed (timeout: task_protection_timeout, default 30s)Use synapse status <agent> to inspect the detailed state of a specific agent, including current task elapsed time and file locks.
Synapse A2A includes hooks and skills for automated CI monitoring and repair when used with Claude Code.
check-ci-trigger.sh) detects git push or gh pr create commandspoll-ci.sh — polls GitHub Actions workflow statuspoll-pr-status.sh — polls merge conflict state and CodeRabbit review commentssystemMessage notification suggesting the appropriate fix skill| Skill | Description |
|---|---|
/check-ci |
Manually check CI status, merge conflict state, and CodeRabbit review status. Use --fix to get suggested repair commands |
/fix-ci |
Auto-diagnose and fix CI failures (lint, format, type-check, test) |
/fix-conflict |
Auto-resolve merge conflicts by fetching the base branch, performing a test merge, analyzing both sides of each conflict, resolving, verifying locally, and pushing |
/fix-review |
Auto-fix CodeRabbit review comments — classifies comments as Bug/Security (auto-fix), Style (auto-fix), or Suggestion (report only). Use --all to also fix suggestions |
git push / gh pr create
└─→ check-ci-trigger.sh (PostToolUse hook)
├─→ poll-ci.sh (background) → monitors GitHub Actions
└─→ poll-pr-status.sh (background)
├─→ checks mergeable state → if CONFLICTING → notifies agent → /fix-conflict
└─→ checks CodeRabbit reviews → if comments found → classifies → notifies agent → /fix-review
These hooks and skills are pre-configured in .claude/settings.json. The following permissions are required:
Skill(check-ci), Skill(fix-ci), Skill(fix-conflict), Skill(fix-review)Bash(gh api:*), Bash(gh repo view:*), Bash(gh pr checks:*)Comprehensive test suite verifies A2A protocol compliance:
# All tests
pytest
# Specific category
pytest tests/test_a2a_compat.py -v
pytest tests/test_sender_identification.py -v
# Opt-in live E2E against real agent CLIs
SYNAPSE_LIVE_E2E=1 pytest tests/test_live_e2e_agents.py -q
# Limit live E2E to specific agents
SYNAPSE_LIVE_E2E=1 SYNAPSE_LIVE_E2E_PROFILES=copilot,codex \
pytest tests/test_live_e2e_agents.py -q
Live E2E tests are skipped by default. They launch the real claude, codex,
gemini, opencode, and copilot CLIs in headless Synapse sessions and verify
that a message sent through /tasks/send completes and returns the requested
token. Use them for local validation or a dedicated CI job with authenticated
agent CLIs.
Customize environment variables and initial instructions via .synapse/settings.json.
| Scope | Path | Priority |
|---|---|---|
| User | ~/.synapse/settings.json |
Low |
| Project | ./.synapse/settings.json |
Medium |
| Local | ./.synapse/settings.local.json |
High (gitignore recommended) |
Higher priority settings override lower ones.
# Create .synapse/ directory (copies all template files)
synapse init
# ? Where do you want to create .synapse/?
# ❯ User scope (~/.synapse/)
# Project scope (./.synapse/)
#
# ✔ Created ~/.synapse
# Reset to defaults
synapse reset
# Edit settings interactively (TUI)
synapse config
# Show current settings (read-only)
synapse config show
synapse config show --scope user
synapse init copies these files to .synapse/:
| File | Description |
|---|---|
settings.json |
Environment variables and initial instruction settings |
default.md |
Initial instructions common to all agents |
gemini.md |
Gemini-specific initial instructions |
file-safety.md |
File Safety instructions |
learning.md |
Learning Mode instructions (structured prompt improvement and learning feedback) |
proactive.md |
Proactive Mode instructions (task-size x feature matrix with per-feature skip conditions) |
{
"env": {
"SYNAPSE_HISTORY_ENABLED": "true",
"SYNAPSE_FILE_SAFETY_ENABLED": "true",
"SYNAPSE_FILE_SAFETY_DB_PATH": ".synapse/file_safety.db"
},
"instructions": {
"default": "[SYNAPSE INSTRUCTIONS...]\n...",
"claude": "",
"gemini": "",
"codex": ""
},
"approvalMode": "required",
"a2a": {
"flow": "auto"
}
}
| Variable | Description | Default |
|---|---|---|
SYNAPSE_HISTORY_ENABLED |
Enable task history | true |
SYNAPSE_FILE_SAFETY_ENABLED |
Enable file safety | true |
SYNAPSE_FILE_SAFETY_DB_PATH |
File safety DB path | .synapse/file_safety.db |
SYNAPSE_FILE_SAFETY_RETENTION_DAYS |
Lock history retention days | 30 |
SYNAPSE_AUTH_ENABLED |
Enable API authentication | false |
SYNAPSE_API_KEYS |
API keys (comma-separated) | - |
SYNAPSE_ADMIN_KEY |
Admin key | - |
SYNAPSE_ALLOW_LOCALHOST |
Skip auth for localhost | true |
SYNAPSE_USE_HTTPS |
Use HTTPS | false |
SYNAPSE_WEBHOOK_SECRET |
Webhook secret | - |
SYNAPSE_WEBHOOK_TIMEOUT |
Webhook timeout (sec) | 10 |
SYNAPSE_WEBHOOK_MAX_RETRIES |
Webhook retry count | 3 |
SYNAPSE_SKILLS_DIR |
Central skill store directory | ~/.synapse/skills |
SYNAPSE_REPLY_TARGET_DIR |
Reply target persistence directory | ~/.a2a/reply |
SYNAPSE_LONG_MESSAGE_THRESHOLD |
Character threshold for file storage | 200 |
SYNAPSE_LONG_MESSAGE_TTL |
TTL for message files (seconds) | 3600 |
SYNAPSE_LONG_MESSAGE_DIR |
Directory for message files | System temp |
SYNAPSE_SEND_MESSAGE_THRESHOLD |
Threshold for auto temp-file fallback (bytes) | 102400 |
SYNAPSE_LEARNING_MODE_ENABLED |
Enable Prompt Improvement section (Goal/Problem/Fix, recommended rewrite, detail-level options). Independent of TRANSLATION flag. Either flag enables learning.md injection and Tips |
false |
SYNAPSE_LEARNING_MODE_TRANSLATION |
Enable JP-to-EN Learning section (reusable English patterns with slot mapping). Independent of LEARNING_MODE_ENABLED flag. Either flag enables learning.md injection and Tips |
false |
SYNAPSE_PROACTIVE_MODE_ENABLED |
Enable Proactive Mode: guides agents to use Synapse features (shared memory, canvas, file safety, delegation, broadcast) based on task-size x feature matrix with per-feature skip conditions. Appends .synapse/proactive.md instructions at startup. Off by default |
false |
SYNAPSE_OBSERVATION_ENABLED |
Enable PTY/A2A observation capture for the self-learning pipeline | true |
SYNAPSE_OBSERVATION_DB_PATH |
Path to observations SQLite database | .synapse/observations.db |
SYNAPSE_INSTINCT_DB_PATH |
Path to instincts SQLite database | .synapse/instincts.db |
| Setting | Value | Description |
|---|---|---|
flow |
roundtrip |
Always wait for result |
flow |
oneway |
Always forward only (don't wait) |
flow |
auto |
Flag-controlled; if omitted, waits by default |
Controls whether to show a confirmation prompt before sending initial instructions.
| Setting | Description |
|---|---|
required |
Show approval prompt at startup (default) |
auto |
Send instructions automatically without prompting |
When set to required, you'll see a prompt like:
[Synapse] Agent: synapse-claude-8100 | Port: 8100
[Synapse] Initial instructions will be sent to configure A2A communication.
Proceed? [Y/n/s(skip)]:
Options:
Customize instructions sent at agent startup:
{
"instructions": {
"default": "Common instructions for all agents",
"claude": "Claude-specific instructions (takes priority over default)",
"gemini": "Gemini-specific instructions",
"codex": "Codex-specific instructions"
}
}
Priority:
claude, gemini, codex, opencode, copilot) if presentdefaultPlaceholders:
{{agent_id}} - Runtime ID (e.g., synapse-claude-8100){{port}} - Port number (e.g., 8100)See guides/settings.md for details.
Merging a pyproject.toml version change to main automatically creates a git tag, GitHub Release, and publishes to PyPI.
# 1. Generate changelog with git-cliff
python scripts/generate_changelog.py
# 2. Update version in pyproject.toml and review CHANGELOG.md
# 3. Create PR and merge to main
# 4. Automation handles: tag → GitHub Release → PyPI → Homebrew/Scoop PR
# Build and publish with uv
uv build
uv publish
macOS / Linux / WSL2 (recommended):
pipx install synapse-a2a
# Upgrade
pipx upgrade synapse-a2a
# Uninstall
pipx uninstall synapse-a2a
Windows (Scoop, experimental — WSL2 required for pty):
scoop bucket add synapse-a2a https://github.com/s-hiraoku/scoop-synapse-a2a
scoop install synapse-a2a
# Upgrade
scoop update synapse-a2a
spawn or team start command is executing, the agent may be spawned in the unintended tab. Please wait for the command to complete before interacting with the terminal.Codex CLI runs in a sandbox by default with restricted network access. To use @agent pattern for inter-agent communication, allow network access in ~/.codex/config.toml.
Global Setting (applies to all projects):
# ~/.codex/config.toml
sandbox_mode = "workspace-write"
[sandbox_workspace_write]
network_access = true
Per-Project Setting:
# ~/.codex/config.toml
[projects."/path/to/your/project"]
sandbox_mode = "workspace-write"
[projects."/path/to/your/project".sandbox_workspace_write]
network_access = true
See guides/troubleshooting.md for details.
Security, notification, and high-performance communication features for production environments.
# Start with authentication enabled
export SYNAPSE_AUTH_ENABLED=true
export SYNAPSE_API_KEYS=<YOUR_API_KEY>
synapse claude
# Request with API Key
curl -H "X-API-Key: <YOUR_API_KEY>" http://localhost:8100/tasks
Send notifications to external URLs when tasks complete.
# Register webhook
curl -X POST http://localhost:8100/webhooks \
-H "Content-Type: application/json" \
-d '{"url": "https://your-server.com/hook", "events": ["task.completed"]}'
| Event | Description |
|---|---|
task.completed |
Task completed successfully |
task.failed |
Task failed |
task.canceled |
Task canceled |
Receive task output in real-time.
curl -N http://localhost:8100/tasks/{task_id}/subscribe
Event types:
| Event | Description |
|---|---|
output |
New CLI output |
status |
Status change |
done |
Task complete (includes Artifact) |
Automatically parse CLI output for error detection, status updates, and Artifact generation.
| Feature | Description |
|---|---|
| Error Detection | Detects command not found, permission denied, etc. |
| input_required | Detects question/confirmation prompts |
| TUI Artifact Removal | Strips Ink/Bubble Tea artifacts (spinners, box-drawing, block elements, frame content, Gemini input prompts) from all agent responses |
| Output Parser | Structures code/files/errors |
Use gRPC for high-performance communication.
# Install gRPC dependencies
pip install synapse-a2a[grpc]
# gRPC runs on REST port + 1
# REST: 8100 → gRPC: 8101
See guides/enterprise.md for details.
| Path | Content |
|---|---|
| guides/usage.md | Detailed usage |
| guides/architecture.md | Architecture details |
| guides/enterprise.md | Enterprise features |
| guides/troubleshooting.md | Troubleshooting |
| docs/file-safety.md | File conflict prevention |
| docs/project-philosophy.md | Design philosophy |
MIT License