synapse-a2a 0.2.15__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of synapse-a2a might be problematic. Click here for more details.

Files changed (107) hide show
  1. synapse_a2a-0.2.15/PKG-INFO +1455 -0
  2. synapse_a2a-0.2.15/README.md +1441 -0
  3. synapse_a2a-0.2.15/pyproject.toml +103 -0
  4. synapse_a2a-0.2.15/setup.cfg +4 -0
  5. synapse_a2a-0.2.15/synapse/__init__.py +0 -0
  6. synapse_a2a-0.2.15/synapse/a2a_client.py +544 -0
  7. synapse_a2a-0.2.15/synapse/a2a_compat.py +1137 -0
  8. synapse_a2a-0.2.15/synapse/auth.py +283 -0
  9. synapse_a2a-0.2.15/synapse/cli.py +2392 -0
  10. synapse_a2a-0.2.15/synapse/commands/__init__.py +0 -0
  11. synapse_a2a-0.2.15/synapse/commands/instructions.py +267 -0
  12. synapse_a2a-0.2.15/synapse/commands/list.py +217 -0
  13. synapse_a2a-0.2.15/synapse/commands/start.py +100 -0
  14. synapse_a2a-0.2.15/synapse/config.py +68 -0
  15. synapse_a2a-0.2.15/synapse/controller.py +597 -0
  16. synapse_a2a-0.2.15/synapse/delegation.py +99 -0
  17. synapse_a2a-0.2.15/synapse/error_detector.py +139 -0
  18. synapse_a2a-0.2.15/synapse/file_safety.py +1480 -0
  19. synapse_a2a-0.2.15/synapse/grpc_server.py +402 -0
  20. synapse_a2a-0.2.15/synapse/history.py +704 -0
  21. synapse_a2a-0.2.15/synapse/input_router.py +402 -0
  22. synapse_a2a-0.2.15/synapse/logging_config.py +135 -0
  23. synapse_a2a-0.2.15/synapse/output_parser.py +280 -0
  24. synapse_a2a-0.2.15/synapse/port_manager.py +185 -0
  25. synapse_a2a-0.2.15/synapse/profiles/claude.yaml +19 -0
  26. synapse_a2a-0.2.15/synapse/profiles/codex.yaml +12 -0
  27. synapse_a2a-0.2.15/synapse/profiles/dummy.yaml +13 -0
  28. synapse_a2a-0.2.15/synapse/profiles/gemini.yaml +13 -0
  29. synapse_a2a-0.2.15/synapse/proto/__init__.py +75 -0
  30. synapse_a2a-0.2.15/synapse/proto/a2a_pb2.py +84 -0
  31. synapse_a2a-0.2.15/synapse/proto/a2a_pb2_grpc.py +371 -0
  32. synapse_a2a-0.2.15/synapse/registry.py +299 -0
  33. synapse_a2a-0.2.15/synapse/server.py +349 -0
  34. synapse_a2a-0.2.15/synapse/settings.py +532 -0
  35. synapse_a2a-0.2.15/synapse/shell.py +204 -0
  36. synapse_a2a-0.2.15/synapse/shell_hook.py +112 -0
  37. synapse_a2a-0.2.15/synapse/templates/.synapse/default.md +59 -0
  38. synapse_a2a-0.2.15/synapse/templates/.synapse/delegate.md +40 -0
  39. synapse_a2a-0.2.15/synapse/templates/.synapse/file-safety.md +56 -0
  40. synapse_a2a-0.2.15/synapse/templates/.synapse/gemini.md +59 -0
  41. synapse_a2a-0.2.15/synapse/templates/.synapse/settings.json +32 -0
  42. synapse_a2a-0.2.15/synapse/tools/a2a.py +371 -0
  43. synapse_a2a-0.2.15/synapse/utils.py +64 -0
  44. synapse_a2a-0.2.15/synapse/webhooks.py +294 -0
  45. synapse_a2a-0.2.15/synapse_a2a.egg-info/PKG-INFO +1455 -0
  46. synapse_a2a-0.2.15/synapse_a2a.egg-info/SOURCES.txt +105 -0
  47. synapse_a2a-0.2.15/synapse_a2a.egg-info/dependency_links.txt +1 -0
  48. synapse_a2a-0.2.15/synapse_a2a.egg-info/entry_points.txt +4 -0
  49. synapse_a2a-0.2.15/synapse_a2a.egg-info/requires.txt +5 -0
  50. synapse_a2a-0.2.15/synapse_a2a.egg-info/top_level.txt +1 -0
  51. synapse_a2a-0.2.15/tests/test_a2a_client.py +458 -0
  52. synapse_a2a-0.2.15/tests/test_a2a_compat.py +670 -0
  53. synapse_a2a-0.2.15/tests/test_a2a_compat_extended.py +243 -0
  54. synapse_a2a-0.2.15/tests/test_a2a_tool.py +54 -0
  55. synapse_a2a-0.2.15/tests/test_auth.py +431 -0
  56. synapse_a2a-0.2.15/tests/test_cli.py +1314 -0
  57. synapse_a2a-0.2.15/tests/test_cli_args.py +187 -0
  58. synapse_a2a-0.2.15/tests/test_cli_commands_coverage.py +74 -0
  59. synapse_a2a-0.2.15/tests/test_cli_extended.py +98 -0
  60. synapse_a2a-0.2.15/tests/test_cli_extra.py +96 -0
  61. synapse_a2a-0.2.15/tests/test_cli_file_safety.py +446 -0
  62. synapse_a2a-0.2.15/tests/test_cli_history.py +243 -0
  63. synapse_a2a-0.2.15/tests/test_cli_interactive.py +220 -0
  64. synapse_a2a-0.2.15/tests/test_cli_main.py +213 -0
  65. synapse_a2a-0.2.15/tests/test_cli_refactor_spec.py +181 -0
  66. synapse_a2a-0.2.15/tests/test_cmd_instructions.py +471 -0
  67. synapse_a2a-0.2.15/tests/test_cmd_list_file_safety.py +152 -0
  68. synapse_a2a-0.2.15/tests/test_cmd_list_watch.py +842 -0
  69. synapse_a2a-0.2.15/tests/test_cmd_list_working_dir.py +165 -0
  70. synapse_a2a-0.2.15/tests/test_config.py +149 -0
  71. synapse_a2a-0.2.15/tests/test_controller.py +691 -0
  72. synapse_a2a-0.2.15/tests/test_controller_pty.py +261 -0
  73. synapse_a2a-0.2.15/tests/test_controller_registry_sync.py +173 -0
  74. synapse_a2a-0.2.15/tests/test_controller_resume.py +96 -0
  75. synapse_a2a-0.2.15/tests/test_delegation.py +121 -0
  76. synapse_a2a-0.2.15/tests/test_error_detector.py +268 -0
  77. synapse_a2a-0.2.15/tests/test_file_safety.py +735 -0
  78. synapse_a2a-0.2.15/tests/test_file_safety_extended.py +180 -0
  79. synapse_a2a-0.2.15/tests/test_file_safety_pid.py +432 -0
  80. synapse_a2a-0.2.15/tests/test_gemini_init_timing.py +303 -0
  81. synapse_a2a-0.2.15/tests/test_grpc_server.py +230 -0
  82. synapse_a2a-0.2.15/tests/test_grpc_server_methods.py +195 -0
  83. synapse_a2a-0.2.15/tests/test_history.py +1013 -0
  84. synapse_a2a-0.2.15/tests/test_input_router.py +601 -0
  85. synapse_a2a-0.2.15/tests/test_input_router_extended.py +295 -0
  86. synapse_a2a-0.2.15/tests/test_interactive_idle_detection.py +495 -0
  87. synapse_a2a-0.2.15/tests/test_logging_config.py +121 -0
  88. synapse_a2a-0.2.15/tests/test_output_parser.py +444 -0
  89. synapse_a2a-0.2.15/tests/test_port_manager.py +215 -0
  90. synapse_a2a-0.2.15/tests/test_proto.py +28 -0
  91. synapse_a2a-0.2.15/tests/test_refactoring.py +234 -0
  92. synapse_a2a-0.2.15/tests/test_registry.py +295 -0
  93. synapse_a2a-0.2.15/tests/test_registry_extended.py +174 -0
  94. synapse_a2a-0.2.15/tests/test_response_option.py +268 -0
  95. synapse_a2a-0.2.15/tests/test_sender_identification.py +294 -0
  96. synapse_a2a-0.2.15/tests/test_server.py +332 -0
  97. synapse_a2a-0.2.15/tests/test_server_extended.py +152 -0
  98. synapse_a2a-0.2.15/tests/test_server_extra.py +63 -0
  99. synapse_a2a-0.2.15/tests/test_server_lifespan.py +88 -0
  100. synapse_a2a-0.2.15/tests/test_settings.py +724 -0
  101. synapse_a2a-0.2.15/tests/test_shell.py +544 -0
  102. synapse_a2a-0.2.15/tests/test_shell_hook.py +264 -0
  103. synapse_a2a-0.2.15/tests/test_status_unification.py +117 -0
  104. synapse_a2a-0.2.15/tests/test_tools_a2a.py +953 -0
  105. synapse_a2a-0.2.15/tests/test_transport_retention.py +292 -0
  106. synapse_a2a-0.2.15/tests/test_utils.py +199 -0
  107. synapse_a2a-0.2.15/tests/test_webhooks.py +303 -0
@@ -0,0 +1,1455 @@
1
+ Metadata-Version: 2.4
2
+ Name: synapse-a2a
3
+ Version: 0.2.15
4
+ Summary: Agent-to-Agent communication protocol for CLI agents
5
+ Author: Synapse A2A Team
6
+ License: MIT
7
+ Requires-Python: >=3.10
8
+ Description-Content-Type: text/markdown
9
+ Requires-Dist: fastapi>=0.100.0
10
+ Requires-Dist: uvicorn>=0.23.0
11
+ Requires-Dist: pyyaml>=6.0
12
+ Requires-Dist: requests>=2.31.0
13
+ Requires-Dist: httpx>=0.24.0
14
+
15
+ # Synapse A2A
16
+
17
+ > **各エージェントの挙動を変えることなく、エージェント同士を協力させてタスクを実行する**
18
+
19
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
20
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
21
+ [![Tests](https://img.shields.io/badge/tests-915%20passed-brightgreen.svg)](#テスト)
22
+ [![Ask DeepWiki](https://img.shields.io/badge/Ask-DeepWiki-blue)](https://deepwiki.com/s-hiraoku/synapse-a2a)
23
+
24
+ > Claude Code、Codex、Gemini などの CLI エージェントを**そのままの形で**活用しながら、Google A2A プロトコルによるエージェント間協調を実現するフレームワーク
25
+
26
+ ## プロジェクトの目標
27
+
28
+ ```text
29
+ ┌─────────────────────────────────────────────────────────────────┐
30
+ │ ✅ エージェントの挙動を変えない(Non-Invasive) │
31
+ │ ✅ エージェント同士を協力させる(Collaborative) │
32
+ │ ✅ 既存のワークフローを維持する(Transparent) │
33
+ └─────────────────────────────────────────────────────────────────┘
34
+ ```
35
+
36
+ Synapse A2A は、各エージェントの入出力を**透過的に**ラップするだけで、エージェント自体の挙動には一切手を加えません。これにより:
37
+
38
+ - **各エージェントの強みを活かす**: 役割や得意分野はユーザーが自由に設定可能
39
+ - **学習コストゼロ**: 既存の使い方をそのまま継続できる
40
+ - **将来の変更に強い**: エージェントのアップデートに影響されにくい
41
+
42
+ 詳細は [プロジェクト哲学](docs/project-philosophy.md) を参照してください。
43
+
44
+ ```mermaid
45
+ flowchart LR
46
+ subgraph Terminal1["Terminal 1"]
47
+ subgraph Agent1["synapse claude :8100"]
48
+ Server1["A2A Server"]
49
+ PTY1["PTY + Claude CLI"]
50
+ end
51
+ end
52
+ subgraph Terminal2["Terminal 2"]
53
+ subgraph Agent2["synapse codex :8120"]
54
+ Server2["A2A Server"]
55
+ PTY2["PTY + Codex CLI"]
56
+ end
57
+ end
58
+ subgraph External["外部"]
59
+ ExtAgent["Google A2A Agent"]
60
+ end
61
+
62
+ Server1 <-->|"POST /tasks/send"| Server2
63
+ Server1 <-->|"A2A Protocol"| ExtAgent
64
+ Server2 <-->|"A2A Protocol"| ExtAgent
65
+ ```
66
+
67
+ ---
68
+
69
+ ## 目次
70
+
71
+ - [主な特徴](#主な特徴)
72
+ - [前提条件](#前提条件)
73
+ - [クイックスタート](#クイックスタート)
74
+ - [ユースケース](#ユースケース)
75
+ - [Claude Code プラグイン](#claude-code-プラグイン)
76
+ - [ドキュメント](#ドキュメント)
77
+ - [アーキテクチャ](#アーキテクチャ)
78
+ - [CLI コマンド](#cli-コマンド)
79
+ - [API エンドポイント](#api-エンドポイント)
80
+ - [Task 構造](#task-構造)
81
+ - [送信元識別](#送信元識別)
82
+ - [Priority(優先度)](#priority優先度)
83
+ - [Agent Card](#agent-card)
84
+ - [レジストリとポート管理](#レジストリとポート管理)
85
+ - [File Safety(ファイル競合防止)](#file-safetyファイル競合防止)
86
+ - [テスト](#テスト)
87
+ - [設定ファイル (.synapse)](#設定ファイル-synapse)
88
+ - [開発・リリース](#開発リリース)
89
+
90
+ ---
91
+
92
+ ## 主な特徴
93
+
94
+ | カテゴリ | 機能 |
95
+ | ---------------------- | -------------------------------------------------------- |
96
+ | **A2A 準拠** | 全通信が Message/Part + Task 形式、Agent Card による発見 |
97
+ | **CLI 連携** | 既存の CLI ツールを改造せずに A2A エージェント化 |
98
+ | **@Agent 記法** | `@claude`, `@codex-8120` で直接メッセージ送信 |
99
+ | **送信元識別** | `metadata.sender` + PID マッチングで送信元を自動識別 |
100
+ | **Priority Interrupt** | Priority 5 で SIGINT 送信後にメッセージ送信(緊急停止) |
101
+ | **マルチインスタンス** | 同じエージェントタイプを複数同時起動(ポート自動割当) |
102
+ | **外部連携** | 他の Google A2A エージェントとの通信 |
103
+ | **タスク委任** | 自然言語ルールで他エージェントへ自動タスク転送 |
104
+ | **File Safety** | ファイルロックと変更追跡でマルチエージェント競合を防止(`synapse list` でロック状態を確認可能) |
105
+
106
+ ---
107
+
108
+ ## 前提条件
109
+
110
+ - **OS**: macOS / Linux(Windows は WSL2 推奨)
111
+ - **Python**: 3.10+
112
+ - **CLI ツール**: 使用するエージェントの CLI を事前にインストール & 初期設定
113
+ - [Claude Code](https://docs.anthropic.com/en/docs/claude-code)
114
+ - [Codex CLI](https://github.com/openai/codex)
115
+ - [Gemini CLI](https://github.com/google-gemini/gemini-cli)
116
+
117
+ ---
118
+
119
+ ## クイックスタート
120
+
121
+ ### 1. Synapse A2A のインストール
122
+
123
+ ```bash
124
+ # PyPI からインストール(推奨)
125
+ pip install synapse-a2a
126
+
127
+ # gRPC も使う場合
128
+ pip install "synapse-a2a[grpc]"
129
+ ```
130
+
131
+ 開発者向け(このリポジトリを編集する場合):
132
+
133
+ ```bash
134
+ # uv でインストール
135
+ uv sync
136
+
137
+ # または pip(editable)
138
+ pip install -e .
139
+ ```
140
+
141
+ ### 2. Claude Code プラグインのインストール(推奨)
142
+
143
+ **Synapse A2A を最大限活用するには、Claude Code プラグインのインストールを強く推奨します。**
144
+
145
+ プラグインをインストールすると、Claude が自動的に Synapse A2A の機能を理解し、@agent パターンでのメッセージ送信、タスク委任、File Safety などを適切に使用できるようになります。
146
+
147
+ ```bash
148
+ # Claude Code 内で実行
149
+ /plugin marketplace add s-hiraoku/synapse-a2a
150
+ /plugin install synapse-a2a@s-hiraoku/synapse-a2a
151
+ ```
152
+
153
+ 詳細は [Claude Code プラグイン](#claude-code-プラグイン) を参照してください。
154
+
155
+ ### 3. エージェントを起動
156
+
157
+ ```bash
158
+ # Terminal 1: Claude
159
+ synapse claude
160
+
161
+ # Terminal 2: Codex
162
+ synapse codex
163
+
164
+ # Terminal 3: Gemini
165
+ synapse gemini
166
+ ```
167
+
168
+ > Note: 端末のスクロールバック表示が崩れる場合は、以下の起動方法を試してください。
169
+ > ```bash
170
+ > uv run synapse gemini
171
+ > # または
172
+ > uv run python -m synapse.cli gemini
173
+ > ```
174
+
175
+ ポートは自動割当されます:
176
+
177
+ | エージェント | ポート範囲 |
178
+ | ------------ | ---------- |
179
+ | Claude | 8100-8109 |
180
+ | Gemini | 8110-8119 |
181
+ | Codex | 8120-8129 |
182
+
183
+ ### 4. エージェント間通信
184
+
185
+ 端末内で `@Agent` を使ってメッセージ送信:
186
+
187
+ ```text
188
+ @codex この設計をレビューして
189
+ @gemini APIの改善案を出して
190
+ ```
191
+
192
+ 複数インスタンスがある場合は `@type-port` 形式で指定:
193
+
194
+ ```text
195
+ @codex-8120 こちらを担当して
196
+ @codex-8121 こちらを担当して
197
+ ```
198
+
199
+ ### 5. HTTP API
200
+
201
+ ```bash
202
+ # メッセージ送信
203
+ curl -X POST http://localhost:8100/tasks/send \
204
+ -H "Content-Type: application/json" \
205
+ -d '{"message": {"role": "user", "parts": [{"type": "text", "text": "Hello!"}]}}'
206
+
207
+ # 緊急停止(Priority 5)
208
+ curl -X POST "http://localhost:8100/tasks/send-priority?priority=5" \
209
+ -H "Content-Type: application/json" \
210
+ -d '{"message": {"role": "user", "parts": [{"type": "text", "text": "Stop!"}]}}'
211
+ ```
212
+
213
+ ---
214
+
215
+ ## ユースケース
216
+
217
+ ### 1. 瞬時の仕様確認 (Simple)
218
+ コーディングに特化した **Claude** で作業中、最新のライブラリ仕様やエラー情報を確認したい場合、Web検索が得意な **Gemini** にその場で問い合わせることで、コンテキストスイッチを防ぎます。
219
+
220
+ ```bash
221
+ # Claudeの画面で:
222
+ @gemini Python 3.12の新しいf-stringの仕様を要約して
223
+ ```
224
+
225
+ ### 2. 設計のクロスレビュー (Intermediate)
226
+ 自分の考えた設計に対して、異なる視点を持つエージェントからフィードバックをもらいます。
227
+
228
+ ```bash
229
+ # Claudeで設計案を出した後に:
230
+ @gemini この設計について、スケーラビリティと保守性の観点から批判的にレビューして
231
+ ```
232
+
233
+ ### 3. TDD ペアプログラミング (Intermediate)
234
+ 「テストを書く人」と「実装する人」を分けることで、堅牢なコードを作成します。
235
+
236
+ ```bash
237
+ # Terminal 1 (Codex):
238
+ auth.py の単体テストを作成して。ケースは正常系と、トークン期限切れの異常系で。
239
+
240
+ # Terminal 2 (Claude):
241
+ @codex-8120 が作成したテストに通るように auth.py を実装して
242
+ ```
243
+
244
+ ### 4. セキュリティ監査 (Specialized)
245
+ 自分の書いたコードをコミットする前に、セキュリティ専門家という役割を与えたエージェントに監査させます。
246
+
247
+ ```bash
248
+ # Gemini に役割を与える
249
+ あなたはセキュリティエンジニアです。脆弱性(SQLi, XSS等)の観点のみでレビューしてください。
250
+
251
+ # コードを書いてから:
252
+ @gemini 現在の変更内容(git diff)を監査して
253
+ ```
254
+
255
+ ### 5. エラーログからの自動修復 (Advanced)
256
+ テスト実行でエラーが出た際、ログファイルをエージェントに渡して修正案を適用させます。
257
+
258
+ ```bash
259
+ # テストが失敗した...
260
+ pytest > error.log
261
+
262
+ # エージェントに修正を依頼
263
+ @claude error.log を読んで、原因となっている synapse/server.py の箇所を修正して
264
+ ```
265
+
266
+ ### 6. 言語・フレームワークの移行 (Advanced)
267
+ 大規模なリファクタリングで、古い構文を新しい構文に置換する作業を分担します。
268
+
269
+ ```bash
270
+ # Terminal 1 (Claude):
271
+ legacy_api.js を読み込んで、TypeScriptの型定義を作成して
272
+
273
+ # Terminal 2 (Codex):
274
+ @claude が作成した型定義を使って、legacy_api.js を src/new_api.ts に書き換えて
275
+ ```
276
+
277
+ ### SSHリモート環境との違い
278
+
279
+ | 操作 | SSH | Synapse |
280
+ |-----|-----|---------|
281
+ | 手動でCLI操作 | ◎ | ◎ |
282
+ | プログラムからタスク投入 | △ expect等が必要 | ◎ HTTP API |
283
+ | 複数クライアント同時接続 | △ 複数セッション | ◎ 単一エンドポイント |
284
+ | 進捗のリアルタイム通知 | ✗ | ◎ SSE/Webhook |
285
+ | エージェント間の自動連携 | ✗ | ◎ @Agent記法 |
286
+
287
+ > **Note**: 個人でCLI操作するだけなら SSH で十分なケースも多いです。Synapse は「自動化」「連携」「マルチエージェント」が必要な場面で真価を発揮します。
288
+
289
+ ---
290
+
291
+ ## Claude Code プラグイン
292
+
293
+ Synapse A2A を Claude Code で使用する場合、**プラグインのインストールを強く推奨します**。
294
+
295
+ ### なぜプラグインが必要か
296
+
297
+ プラグインをインストールすると、Claude が以下を自動的に理解・実行できるようになります:
298
+
299
+ - **synapse send**: `synapse send codex "ファイルを修正して" --from claude` でのエージェント間通信
300
+ - **@agent パターン**: `@codex ファイルを修正して` でユーザー入力からの直接送信
301
+ - **優先度制御**: Priority 1-5 でのメッセージ送信(5 は緊急停止)
302
+ - **タスク委任**: `delegation.enabled` での自動タスク振り分け
303
+ - **File Safety**: ファイルロックと変更追跡でマルチエージェント競合を防止
304
+ - **履歴管理**: タスク履歴の検索・エクスポート・統計
305
+
306
+ ### インストール方法
307
+
308
+ ```bash
309
+ # Claude Code 内で実行
310
+ /plugin marketplace add s-hiraoku/synapse-a2a
311
+ /plugin install synapse-a2a@s-hiraoku/synapse-a2a
312
+ ```
313
+
314
+ ### 含まれるスキル
315
+
316
+ | スキル | 説明 |
317
+ |--------|------|
318
+ | **synapse-a2a** | エージェント間通信の包括的ガイド。`synapse send` コマンド、@agent ルーティング、優先度、A2A プロトコル、履歴管理、File Safety、設定管理をカバー |
319
+ | **delegation** | 自動タスク委任の設定。`delegation.enabled` での有効化、事前チェック、エラーハンドリング、File Safety 連携 |
320
+
321
+ ### ディレクトリ構造
322
+
323
+ ```text
324
+ plugins/
325
+ └── synapse-a2a/
326
+ ├── .claude-plugin/plugin.json
327
+ ├── README.md
328
+ └── skills/
329
+ ├── synapse-a2a/SKILL.md
330
+ └── delegation/SKILL.md
331
+ ```
332
+
333
+ 詳細は [plugins/synapse-a2a/README.md](plugins/synapse-a2a/README.md) を参照してください。
334
+
335
+ > **Note**: Codex もプラグインには対応していませんが、展開された skills を `.codex/` ディレクトリ(具体的には `.codex/skills/`)に配置することで、これらの機能を活用することが可能です。
336
+
337
+ ---
338
+
339
+ ## ドキュメント
340
+
341
+ - [guides/README.md](guides/README.md) - ドキュメント全体の見取り図
342
+ - [guides/multi-agent-setup.md](guides/multi-agent-setup.md) - セットアップ手順
343
+ - [guides/usage.md](guides/usage.md) - コマンドと運用パターン
344
+ - [guides/settings.md](guides/settings.md) - `.synapse` 設定の詳細
345
+ - [guides/troubleshooting.md](guides/troubleshooting.md) - よくある問題と対処
346
+
347
+ ---
348
+
349
+ ## アーキテクチャ
350
+
351
+ ### A2A サーバー / クライアント構成
352
+
353
+ Synapse では **各エージェントが A2A サーバーとして動作** します。中央サーバーは存在せず、P2P 構成です。
354
+
355
+ ```
356
+ ┌─────────────────────────────────────┐ ┌─────────────────────────────────────┐
357
+ │ synapse claude (port 8100) │ │ synapse codex (port 8120) │
358
+ │ ┌───────────────────────────────┐ │ │ ┌───────────────────────────────┐ │
359
+ │ │ FastAPI Server (A2A Server) │ │ │ │ FastAPI Server (A2A Server) │ │
360
+ │ │ /.well-known/agent.json │ │ │ │ /.well-known/agent.json │ │
361
+ │ │ /tasks/send │◄─┼────┼──│ A2AClient │ │
362
+ │ │ /tasks/{id} │ │ │ └───────────────────────────────┘ │
363
+ │ └───────────────────────────────┘ │ │ ┌───────────────────────────────┐ │
364
+ │ ┌───────────────────────────────┐ │ │ │ PTY + Codex CLI │ │
365
+ │ │ PTY + Claude CLI │ │ │ └───────────────────────────────┘ │
366
+ │ └───────────────────────────────┘ │ └─────────────────────────────────────┘
367
+ └─────────────────────────────────────┘
368
+ ```
369
+
370
+ 各エージェントは:
371
+
372
+ - **A2A サーバー**: 他のエージェントからのリクエストを受け付ける
373
+ - **A2A クライアント**: 他のエージェントにリクエストを送信する
374
+
375
+ ### 主要コンポーネント
376
+
377
+ | コンポーネント | ファイル | 役割 |
378
+ | ------------------ | ------------------------- | ------------------------ |
379
+ | FastAPI Server | `synapse/server.py` | A2A エンドポイント提供 |
380
+ | A2A Router | `synapse/a2a_compat.py` | A2A プロトコル実装 |
381
+ | A2A Client | `synapse/a2a_client.py` | 他エージェントへの通信 |
382
+ | TerminalController | `synapse/controller.py` | PTY 管理、READY/PROCESSING 検出 |
383
+ | InputRouter | `synapse/input_router.py` | @Agent パターン検出 |
384
+ | AgentRegistry | `synapse/registry.py` | エージェント登録・検索 |
385
+
386
+ ### 起動シーケンス
387
+
388
+ ```mermaid
389
+ sequenceDiagram
390
+ participant Synapse as Synapse Server
391
+ participant Registry as AgentRegistry
392
+ participant PTY as TerminalController
393
+ participant CLI as CLI Agent
394
+
395
+ Synapse->>Registry: 1. エージェント登録 (agent_id, pid, port)
396
+ Synapse->>PTY: 2. PTY 起動
397
+ PTY->>CLI: 3. CLI エージェント起動
398
+ Synapse->>PTY: 4. 初期指示送信 (sender: synapse-system)
399
+ PTY->>CLI: 5. AI が初期指示を受信
400
+ ```
401
+
402
+ ### 通信フロー
403
+
404
+ ```mermaid
405
+ sequenceDiagram
406
+ participant User as ユーザー
407
+ participant Claude as Claude (8100)
408
+ participant Client as A2AClient
409
+ participant Codex as Codex (8120)
410
+
411
+ User->>Claude: @codex 設計をレビューして
412
+ Claude->>Client: send_to_local()
413
+ Client->>Codex: POST /tasks/send-priority
414
+ Codex->>Codex: Task 作成 → PTY に書き込み
415
+ Codex-->>Client: {"task": {"id": "...", "status": "working"}}
416
+ Client-->>Claude: [→ codex] 送信完了
417
+ ```
418
+
419
+ ---
420
+
421
+ ## CLI コマンド
422
+
423
+ ### 基本操作
424
+
425
+ ```bash
426
+ # エージェント起動(フォアグラウンド)
427
+ synapse claude
428
+ synapse codex
429
+ synapse gemini
430
+
431
+ # ポート指定
432
+ synapse claude --port 8105
433
+
434
+ # CLI ツールに引数を渡す
435
+ synapse claude -- --resume
436
+ ```
437
+
438
+ ### コマンド一覧
439
+
440
+ | コマンド | 説明 |
441
+ | --------------------------------- | ---------------------- |
442
+ | `synapse <profile>` | フォアグラウンドで起動 |
443
+ | `synapse start <profile>` | バックグラウンドで起動 |
444
+ | `synapse stop <profile\|id>` | エージェント停止(ID指定も可) |
445
+ | `synapse --version` | バージョン情報表示 |
446
+ | `synapse list` | 実行中エージェント一覧(`--watch` で TRANSPORT 列表示) |
447
+ | `synapse logs <profile>` | ログ表示 |
448
+ | `synapse send <target> <message>` | メッセージ送信 |
449
+ | `synapse instructions show` | インストラクション内容表示 |
450
+ | `synapse instructions files` | インストラクションファイル一覧 |
451
+ | `synapse instructions send` | 初期インストラクション再送信 |
452
+ | `synapse history list` | タスク履歴表示 |
453
+ | `synapse history show <task_id>` | タスク詳細表示 |
454
+ | `synapse history search` | キーワード検索 |
455
+ | `synapse history cleanup` | 古いデータ削除 |
456
+ | `synapse history stats` | 統計情報表示 |
457
+ | `synapse history export` | JSON/CSV エクスポート |
458
+ | `synapse file-safety status` | ファイル安全統計表示 |
459
+ | `synapse file-safety locks` | アクティブロック一覧 |
460
+ | `synapse file-safety lock` | ファイルをロック |
461
+ | `synapse file-safety unlock` | ロック解放 |
462
+ | `synapse file-safety history` | ファイル変更履歴 |
463
+ | `synapse file-safety recent` | 最近の変更一覧 |
464
+ | `synapse file-safety record` | 変更を手動記録 |
465
+ | `synapse file-safety cleanup` | 古いデータ削除 |
466
+ | `synapse file-safety debug` | デバッグ情報表示 |
467
+
468
+ ### コンテキストの再開 (Resume Mode)
469
+
470
+ 既存のセッションを再開する場合、以下のフラグを使用すると **初期インストラクション(A2A プロトコル説明)の送信をスキップ** できます。これにより、コンテキストを汚さずにスムーズに作業を継続できます。
471
+
472
+ ```bash
473
+ # Claude Code のセッション再開
474
+ synapse claude -- --resume
475
+
476
+ # Gemini の履歴指定再開
477
+ synapse gemini -- --resume=5
478
+
479
+ # フラグは settings.json でカスタマイズ可能
480
+ synapse codex -- resume --last
481
+ ```
482
+
483
+ デフォルトの対応フラグ(`settings.json` で変更可能):
484
+ - **Claude**: `--resume`, `--continue`, `-r`, `-c`
485
+ - **Gemini**: `--resume`, `-r`
486
+ - **Codex**: `resume`
487
+
488
+ ### インストラクション管理
489
+
490
+ `--resume` モードで起動した場合など、初期インストラクションが送信されなかった場合に、手動で再送信できます。
491
+
492
+ ```bash
493
+ # インストラクション内容を確認
494
+ synapse instructions show claude
495
+
496
+ # 利用されるインストラクションファイル一覧
497
+ synapse instructions files claude
498
+
499
+ # 実行中のエージェントに初期インストラクションを送信
500
+ synapse instructions send claude
501
+
502
+ # 送信前にプレビュー
503
+ synapse instructions send claude --preview
504
+
505
+ # 特定のエージェントIDを指定して送信
506
+ synapse instructions send synapse-claude-8100
507
+ ```
508
+
509
+ この機能は以下のケースで役立ちます:
510
+ - `--resume` モードで起動後、A2A プロトコル情報が必要になった場合
511
+ - エージェントがインストラクションを失った/忘れた場合のリカバリ
512
+ - インストラクション内容の確認・デバッグ
513
+
514
+ ### 外部エージェント管理
515
+
516
+ ```bash
517
+ # 外部エージェント登録
518
+ synapse external add http://other-agent:9000 --alias other
519
+
520
+ # 一覧表示
521
+ synapse external list
522
+
523
+ # メッセージ送信
524
+ synapse external send other "タスクを処理して"
525
+ ```
526
+
527
+ ### タスク履歴管理
528
+
529
+ タスク履歴機能により、過去のエージェント実行結果を検索・参照・分析できます。
530
+
531
+ **有効化:**
532
+
533
+ ```bash
534
+ # 環境変数で有効化
535
+ export SYNAPSE_HISTORY_ENABLED=true
536
+ synapse claude
537
+ ```
538
+
539
+ #### 基本操作
540
+
541
+ ```bash
542
+ # 最新50件の履歴を表示
543
+ synapse history list
544
+
545
+ # 特定エージェントのみ表示
546
+ synapse history list --agent claude
547
+
548
+ # カスタム件数で表示
549
+ synapse history list --limit 100
550
+
551
+ # タスク詳細を表示
552
+ synapse history show task-id-uuid
553
+ ```
554
+
555
+ #### キーワード検索(Phase 2a)
556
+
557
+ 入力・出力フィールドからキーワードで検索:
558
+
559
+ ```bash
560
+ # 単一キーワード検索
561
+ synapse history search "Python"
562
+
563
+ # 複数キーワード(OR ロジック)
564
+ synapse history search "Python" "Docker"
565
+
566
+ # AND ロジック(すべてのキーワードを含む)
567
+ synapse history search "Python" "function" --logic AND
568
+
569
+ # エージェント フィルタ付き
570
+ synapse history search "Python" --agent claude
571
+
572
+ # 件数制限
573
+ synapse history search "error" --limit 20
574
+ ```
575
+
576
+ #### 統計情報表示(Phase 2d)
577
+
578
+ タスク実行の統計情報を表示:
579
+
580
+ ```bash
581
+ # 全体統計(総数、成功率、エージェント別集計)
582
+ synapse history stats
583
+
584
+ # 特定エージェントの統計
585
+ synapse history stats --agent claude
586
+ ```
587
+
588
+ 出力例:
589
+ ```text
590
+ ============================================================
591
+ TASK HISTORY STATISTICS
592
+ ============================================================
593
+
594
+ Total Tasks: 150
595
+ Completed: 140
596
+ Failed: 10
597
+ Success Rate: 93.3%
598
+
599
+ Database Size: 2.5 MB
600
+ Oldest Task: 2026-01-01 10:00:00
601
+ Newest Task: 2026-01-04 15:30:00
602
+
603
+ ============================================================
604
+ BY AGENT
605
+ ============================================================
606
+
607
+ Agent Total Completed Failed
608
+ ------------------------------------------------------------
609
+ claude 100 95 5
610
+ gemini 50 45 5
611
+ ```
612
+
613
+ #### データ エクスポート(Phase 2b)
614
+
615
+ JSON または CSV 形式でエクスポート:
616
+
617
+ ```bash
618
+ # JSON エクスポート(標準出力)
619
+ synapse history export --format json
620
+
621
+ # CSV エクスポート
622
+ synapse history export --format csv
623
+
624
+ # ファイル保存
625
+ synapse history export --format json --output history.json
626
+ synapse history export --format csv --agent claude > claude_history.csv
627
+
628
+ # フィルタ付きエクスポート
629
+ synapse history export --format json --agent gemini --limit 50
630
+ ```
631
+
632
+ #### リテンション ポリシー(Phase 2c)
633
+
634
+ 古いデータを自動削除:
635
+
636
+ ```bash
637
+ # 30日以上前のデータを削除
638
+ synapse history cleanup --days 30
639
+
640
+ # データベースサイズを 100MB 以下に保つ
641
+ synapse history cleanup --max-size 100
642
+
643
+ # 確認なしで実行(自動化用)
644
+ synapse history cleanup --days 30 --force
645
+
646
+ # ドライラン(削除予定内容を表示するだけ)
647
+ synapse history cleanup --days 30 --dry-run
648
+ ```
649
+
650
+ **ストレージ:**
651
+
652
+ - SQLite データベース: `~/.synapse/history/history.db`
653
+ - 保存項目: タスクID、エージェント名、入力、出力、ステータス、メタデータ
654
+ - 自動インデックス: agent_name, timestamp, task_id
655
+
656
+ **設定:**
657
+
658
+ - **有効化**: `SYNAPSE_HISTORY_ENABLED=true`
659
+ - **無効化**: `SYNAPSE_HISTORY_ENABLED=false`(デフォルト)
660
+ - デフォルトでは無効です。有効化するには環境変数を設定してから起動してください
661
+
662
+ ### synapse send コマンド(推奨)
663
+
664
+ エージェント間通信には `synapse send` コマンドを使用してください。サンドボックス環境でも動作します。
665
+
666
+ ```bash
667
+ synapse send <target> "<message>" [--from <sender>] [--priority <1-5>] [--response | --no-response]
668
+ ```
669
+
670
+ **オプション:**
671
+
672
+ | オプション | 短縮形 | 説明 |
673
+ |-----------|--------|------|
674
+ | `--from` | `-f` | 送信元エージェントID(返信識別用) |
675
+ | `--priority` | `-p` | 優先度 1-4: 通常、5: 緊急停止(SIGINT送信) |
676
+ | `--response` | - | レスポンスを待つ |
677
+ | `--no-response` | - | レスポンスを待たない(デフォルト) |
678
+
679
+ **例:**
680
+
681
+ ```bash
682
+ # メッセージ送信
683
+ synapse send claude "Hello" --priority 1 --from codex
684
+
685
+ # 緊急停止
686
+ synapse send claude "Stop!" --priority 5 --from codex
687
+
688
+ # レスポンスを待つ
689
+ synapse send gemini "分析して" --response --from claude
690
+ ```
691
+
692
+ **重要:** `--from` オプションで送信元を指定してください。受信側が返信先を特定できます。
693
+
694
+ ### 低レベル A2A ツール
695
+
696
+ 高度な操作用:
697
+
698
+ ```bash
699
+ # エージェント一覧
700
+ python -m synapse.tools.a2a list
701
+
702
+ # メッセージ送信
703
+ python -m synapse.tools.a2a send --target claude --priority 1 "Hello"
704
+ ```
705
+
706
+ ---
707
+
708
+ ## API エンドポイント
709
+
710
+ ### A2A 準拠
711
+
712
+ | エンドポイント | メソッド | 説明 |
713
+ | ------------------------- | -------- | ----------------- |
714
+ | `/.well-known/agent.json` | GET | Agent Card |
715
+ | `/tasks/send` | POST | メッセージ送信 |
716
+ | `/tasks/send-priority` | POST | Priority 付き送信 |
717
+ | `/tasks/{id}` | GET | タスク状態取得 |
718
+ | `/tasks` | GET | タスク一覧 |
719
+ | `/tasks/{id}/cancel` | POST | タスクキャンセル |
720
+ | `/status` | GET | READY/PROCESSING 状態 |
721
+
722
+ ### 外部エージェント
723
+
724
+ | エンドポイント | メソッド | 説明 |
725
+ | ------------------------------- | -------- | -------------------- |
726
+ | `/external/discover` | POST | 外部エージェント登録 |
727
+ | `/external/agents` | GET | 一覧 |
728
+ | `/external/agents/{alias}` | DELETE | 削除 |
729
+ | `/external/agents/{alias}/send` | POST | 送信 |
730
+
731
+ ---
732
+
733
+ ## Task 構造
734
+
735
+ A2A プロトコルでは、全ての通信が **Task** として管理されます。
736
+
737
+ ### Task ライフサイクル
738
+
739
+ ```mermaid
740
+ stateDiagram-v2
741
+ [*] --> submitted: POST /tasks/send
742
+ submitted --> working: 処理開始
743
+ working --> completed: 正常終了
744
+ working --> failed: エラー
745
+ working --> input_required: 追加入力待ち
746
+ input_required --> working: 入力受信
747
+ completed --> [*]
748
+ failed --> [*]
749
+ ```
750
+
751
+ ### Task オブジェクト
752
+
753
+ ```json
754
+ {
755
+ "id": "550e8400-e29b-41d4-a716-446655440000",
756
+ "context_id": "conversation-123",
757
+ "status": "working",
758
+ "message": {
759
+ "role": "user",
760
+ "parts": [{ "type": "text", "text": "この設計をレビューして" }]
761
+ },
762
+ "artifacts": [],
763
+ "metadata": {
764
+ "sender": {
765
+ "sender_id": "synapse-claude-8100",
766
+ "sender_type": "claude",
767
+ "sender_endpoint": "http://localhost:8100"
768
+ }
769
+ },
770
+ "created_at": "2024-01-15T10:30:00Z",
771
+ "updated_at": "2024-01-15T10:30:05Z"
772
+ }
773
+ ```
774
+
775
+ ### フィールド説明
776
+
777
+ | フィールド | 型 | 説明 |
778
+ | ------------ | ---------- | ------------------------------------------------------------------- |
779
+ | `id` | string | タスクの一意識別子(UUID) |
780
+ | `context_id` | string? | 会話コンテキスト ID(マルチターン用) |
781
+ | `status` | string | `submitted` / `working` / `completed` / `failed` / `input_required` |
782
+ | `message` | Message | 送信されたメッセージ |
783
+ | `artifacts` | Artifact[] | タスク完了時の成果物 |
784
+ | `metadata` | object | 送信元情報など(`metadata.sender`) |
785
+ | `created_at` | string | 作成日時(ISO 8601) |
786
+ | `updated_at` | string | 更新日時(ISO 8601) |
787
+
788
+ ### Message 構造
789
+
790
+ ```json
791
+ {
792
+ "role": "user",
793
+ "parts": [
794
+ { "type": "text", "text": "メッセージ内容" },
795
+ {
796
+ "type": "file",
797
+ "file": {
798
+ "name": "doc.pdf",
799
+ "mimeType": "application/pdf",
800
+ "bytes": "..."
801
+ }
802
+ }
803
+ ]
804
+ }
805
+ ```
806
+
807
+ | Part タイプ | 説明 |
808
+ | ----------- | ------------------ |
809
+ | `text` | テキストメッセージ |
810
+ | `file` | ファイル添付 |
811
+ | `data` | 構造化データ |
812
+
813
+ ### 初期指示 Task
814
+
815
+ エージェント起動時、Synapse は A2A Task として初期指示を送信します。
816
+
817
+ ```json
818
+ {
819
+ "id": "init-task-id",
820
+ "status": "working",
821
+ "message": {
822
+ "role": "user",
823
+ "parts": [
824
+ { "type": "text", "text": "[Synapse A2A Protocol Instructions]\n\n..." }
825
+ ]
826
+ },
827
+ "metadata": {
828
+ "sender": {
829
+ "sender_id": "synapse-system",
830
+ "sender_type": "system",
831
+ "sender_endpoint": "http://localhost:8100"
832
+ }
833
+ }
834
+ }
835
+ ```
836
+
837
+ PTY 出力形式:
838
+
839
+ ```
840
+ [A2A:init1234:synapse-system] [Synapse A2A Protocol Instructions]
841
+
842
+ You are participating in a multi-agent environment connected via the Synapse A2A Protocol.
843
+
844
+ ## Your Identity
845
+ - Agent ID: synapse-claude-8100
846
+ - Agent Type: claude
847
+ - Port: 8100
848
+
849
+ ## How to Send Messages (@Agent)
850
+ ...
851
+ ```
852
+
853
+ 初期指示には以下が含まれます:
854
+
855
+ - エージェントの identity(ID, type, port)
856
+ - @Agent でのメッセージ送信方法
857
+ - 利用可能な他のエージェント一覧
858
+ - 送信元識別と **返信方法**(`[A2A:task_id:sender_id]` から sender_id を抽出して返信)
859
+
860
+ ---
861
+
862
+ ## 送信元識別
863
+
864
+ A2A メッセージの送信元は `metadata.sender` で識別できます。
865
+
866
+ ### PTY 出力形式
867
+
868
+ ```
869
+ [A2A:<task_id>:<sender_id>] <message>
870
+ ```
871
+
872
+ 例:
873
+
874
+ ```
875
+ [A2A:abc12345:synapse-claude-8100] この設計をレビューしてください
876
+ ```
877
+
878
+ ### Task API での確認
879
+
880
+ ```bash
881
+ curl -s http://localhost:8120/tasks/{task_id} | jq '.metadata.sender'
882
+ ```
883
+
884
+ レスポンス:
885
+
886
+ ```json
887
+ {
888
+ "sender_id": "synapse-claude-8100",
889
+ "sender_type": "claude",
890
+ "sender_endpoint": "http://localhost:8100"
891
+ }
892
+ ```
893
+
894
+ ### 仕組み
895
+
896
+ 1. **送信時**: Registry を参照し、PID マッチングで自身の agent_id を特定
897
+ 2. **Task 作成時**: `metadata.sender` に送信元情報を付与
898
+ 3. **受信時**: PTY プレフィックスまたは Task API で確認
899
+
900
+ ---
901
+
902
+ ## Priority(優先度)
903
+
904
+ | Priority | 動作 | 用途 |
905
+ | -------- | ----------------------- | -------------- |
906
+ | 1-4 | 通常の stdin 書き込み | 通常メッセージ |
907
+ | 5 | SIGINT 送信後に書き込み | 緊急停止 |
908
+
909
+ ```bash
910
+ # 緊急停止
911
+ synapse send claude "Stop!" --priority 5
912
+ ```
913
+
914
+ ---
915
+
916
+ ## Agent Card
917
+
918
+ 各エージェントは `/.well-known/agent.json` で Agent Card を公開します。
919
+
920
+ ```bash
921
+ curl http://localhost:8100/.well-known/agent.json
922
+ ```
923
+
924
+ ```json
925
+ {
926
+ "name": "Synapse Claude",
927
+ "description": "PTY-wrapped claude CLI agent with A2A communication",
928
+ "url": "http://localhost:8100",
929
+ "capabilities": {
930
+ "streaming": false,
931
+ "pushNotifications": false,
932
+ "multiTurn": true
933
+ },
934
+ "skills": [
935
+ {
936
+ "id": "chat",
937
+ "name": "Chat",
938
+ "description": "Send messages to the CLI agent"
939
+ },
940
+ {
941
+ "id": "interrupt",
942
+ "name": "Interrupt",
943
+ "description": "Interrupt current processing"
944
+ }
945
+ ],
946
+ "extensions": {
947
+ "synapse": {
948
+ "agent_id": "synapse-claude-8100",
949
+ "pty_wrapped": true,
950
+ "priority_interrupt": true,
951
+ "at_agent_syntax": true
952
+ }
953
+ }
954
+ }
955
+ ```
956
+
957
+ ### 設計思想
958
+
959
+ Agent Card は「名刺」として他者向け情報のみを含みます:
960
+
961
+ - capabilities, skills, endpoint など
962
+ - 内部指示は含まない(起動時に A2A Task で送信)
963
+
964
+ ---
965
+
966
+ ## レジストリとポート管理
967
+
968
+ ### レジストリファイル
969
+
970
+ ```
971
+ ~/.a2a/registry/
972
+ ├── synapse-claude-8100.json
973
+ ├── synapse-claude-8101.json
974
+ └── synapse-gemini-8110.json
975
+ ```
976
+
977
+ ### 自動クリーンアップ
978
+
979
+ stale エントリは以下の操作で自動削除:
980
+
981
+ - `synapse list` 実行時
982
+ - メッセージ送信時(対象が死んでいる場合)
983
+
984
+ ### ポート範囲
985
+
986
+ ```python
987
+ PORT_RANGES = {
988
+ "claude": (8100, 8109),
989
+ "gemini": (8110, 8119),
990
+ "codex": (8120, 8129),
991
+ "dummy": (8190, 8199),
992
+ }
993
+ ```
994
+
995
+ ---
996
+
997
+ ## File Safety(ファイル競合防止)
998
+
999
+ マルチエージェント環境で複数のエージェントが同時にファイルを編集する際の競合を防止します。
1000
+
1001
+ ```mermaid
1002
+ sequenceDiagram
1003
+ participant Claude
1004
+ participant FS as File Safety
1005
+ participant Gemini
1006
+
1007
+ Claude->>FS: acquire_lock("auth.py")
1008
+ FS-->>Claude: ACQUIRED
1009
+
1010
+ Gemini->>FS: validate_write("auth.py")
1011
+ FS-->>Gemini: DENIED (locked by claude)
1012
+
1013
+ Claude->>FS: release_lock("auth.py")
1014
+ Gemini->>FS: acquire_lock("auth.py")
1015
+ FS-->>Gemini: ACQUIRED
1016
+ ```
1017
+
1018
+ ### 機能
1019
+
1020
+ | 機能 | 説明 |
1021
+ |------|------|
1022
+ | **ファイルロック** | 排他制御で同時編集を防止 |
1023
+ | **変更追跡** | 誰がいつ何を変更したか記録 |
1024
+ | **コンテキスト注入** | 読み込み時に最近の変更履歴を提供 |
1025
+ | **事前バリデーション** | 書き込み前にロック状態をチェック |
1026
+
1027
+ ### 有効化
1028
+
1029
+ ```bash
1030
+ # 環境変数で有効化
1031
+ export SYNAPSE_FILE_SAFETY_ENABLED=true
1032
+ synapse claude
1033
+ ```
1034
+
1035
+ ### 基本コマンド
1036
+
1037
+ ```bash
1038
+ # 統計表示
1039
+ synapse file-safety status
1040
+
1041
+ # アクティブロック一覧
1042
+ synapse file-safety locks
1043
+
1044
+ # ロック取得
1045
+ synapse file-safety lock /path/to/file.py claude --intent "Refactoring"
1046
+
1047
+ # ロック解放
1048
+ synapse file-safety unlock /path/to/file.py claude
1049
+
1050
+ # ファイル変更履歴
1051
+ synapse file-safety history /path/to/file.py
1052
+
1053
+ # 最近の変更一覧
1054
+ synapse file-safety recent
1055
+
1056
+ # 古いデータ削除
1057
+ synapse file-safety cleanup --days 30
1058
+ ```
1059
+
1060
+ ### Python API
1061
+
1062
+ ```python
1063
+ from synapse.file_safety import FileSafetyManager, ChangeType, LockStatus
1064
+
1065
+ manager = FileSafetyManager.from_env()
1066
+
1067
+ # ロック取得
1068
+ result = manager.acquire_lock("/path/to/file.py", "claude", intent="Refactoring")
1069
+ if result["status"] == LockStatus.ACQUIRED:
1070
+ # ファイル編集...
1071
+
1072
+ # 変更記録
1073
+ manager.record_modification(
1074
+ file_path="/path/to/file.py",
1075
+ agent_name="claude",
1076
+ task_id="task-123",
1077
+ change_type=ChangeType.MODIFY,
1078
+ intent="Fix authentication bug"
1079
+ )
1080
+
1081
+ # ロック解放
1082
+ manager.release_lock("/path/to/file.py", "claude")
1083
+
1084
+ # 書き込み前バリデーション
1085
+ validation = manager.validate_write("/path/to/file.py", "gemini")
1086
+ if not validation["allowed"]:
1087
+ print(f"Write blocked: {validation['reason']}")
1088
+ ```
1089
+
1090
+ **ストレージ**: デフォルトは `~/.synapse/file_safety.db` (SQLite)。`SYNAPSE_FILE_SAFETY_DB_PATH` で変更可能(例: `./.synapse/file_safety.db` でプロジェクト単位)。
1091
+
1092
+ 詳細は [docs/file-safety.md](docs/file-safety.md) を参照してください。
1093
+
1094
+ ---
1095
+
1096
+ ## テスト
1097
+
1098
+ 218 のテストケースで A2A プロトコル準拠を検証:
1099
+
1100
+ ```bash
1101
+ # 全テスト
1102
+ pytest
1103
+
1104
+ # 特定カテゴリ
1105
+ pytest tests/test_a2a_compat.py -v
1106
+ pytest tests/test_sender_identification.py -v
1107
+ ```
1108
+
1109
+ ---
1110
+
1111
+ ## 設定ファイル (.synapse)
1112
+
1113
+ `.synapse/settings.json` を使って、環境変数や初期インストラクションをカスタマイズできます。
1114
+
1115
+ ### スコープ
1116
+
1117
+ | スコープ | パス | 優先度 |
1118
+ |----------|------|--------|
1119
+ | User | `~/.synapse/settings.json` | 低 |
1120
+ | Project | `./.synapse/settings.json` | 中 |
1121
+ | Local | `./.synapse/settings.local.json` | 高(gitignore推奨) |
1122
+
1123
+ 高優先度の設定が低優先度を上書きします。
1124
+
1125
+ ### セットアップ
1126
+
1127
+ ```bash
1128
+ # .synapse/ ディレクトリを作成(全テンプレートファイルをコピー)
1129
+ synapse init
1130
+
1131
+ # ? Where do you want to create .synapse/?
1132
+ # ❯ User scope (~/.synapse/)
1133
+ # Project scope (./.synapse/)
1134
+ #
1135
+ # ✔ Created ~/.synapse
1136
+
1137
+ # デフォルトに戻す
1138
+ synapse reset
1139
+ ```
1140
+
1141
+ `synapse init` は以下のファイルを `.synapse/` ディレクトリにコピーします:
1142
+
1143
+ | ファイル | 説明 |
1144
+ |----------|------|
1145
+ | `settings.json` | 環境変数・初期インストラクション設定 |
1146
+ | `default.md` | 全エージェント共通の初期インストラクション |
1147
+ | `gemini.md` | Gemini 用の初期インストラクション |
1148
+ | `delegate.md` | タスク委任ルール |
1149
+ | `file-safety.md` | File Safety の指示 |
1150
+
1151
+ 既に `.synapse/` ディレクトリが存在する場合は、上書き確認のプロンプトが表示されます。
1152
+
1153
+ **Skills のインストール**: Claude Code を使用する場合、**プラグイン marketplace からのインストールを強く推奨します**。これにより、最新のスキルと機能(File Safety, Delegation など)が適用されます。
1154
+
1155
+ ```bash
1156
+ # Claude Code 内で実行
1157
+ /plugin marketplace add s-hiraoku/synapse-a2a
1158
+ /plugin install synapse-a2a@s-hiraoku/synapse-a2a
1159
+ ```
1160
+
1161
+ > **Note**: Codex はプラグインに対応していないため、`synapse init` は `.claude/skills/synapse-a2a/` から `.codex/skills/synapse-a2a/` へスキルを自動コピーします。(Gemini は Skills 非対応のためスキップ)
1162
+
1163
+ ### settings.json の構造
1164
+
1165
+ ```json
1166
+ {
1167
+ "env": {
1168
+ "SYNAPSE_HISTORY_ENABLED": "true",
1169
+ "SYNAPSE_FILE_SAFETY_ENABLED": "true",
1170
+ "SYNAPSE_FILE_SAFETY_DB_PATH": ".synapse/file_safety.db",
1171
+ "SYNAPSE_AUTH_ENABLED": "false",
1172
+ "SYNAPSE_API_KEYS": "",
1173
+ "SYNAPSE_ADMIN_KEY": "",
1174
+ "SYNAPSE_ALLOW_LOCALHOST": "true",
1175
+ "SYNAPSE_USE_HTTPS": "false",
1176
+ "SYNAPSE_WEBHOOK_SECRET": "",
1177
+ "SYNAPSE_WEBHOOK_TIMEOUT": "10",
1178
+ "SYNAPSE_WEBHOOK_MAX_RETRIES": "3"
1179
+ },
1180
+ "instructions": {
1181
+ "default": "[SYNAPSE INSTRUCTIONS...]\n...",
1182
+ "claude": "",
1183
+ "gemini": "",
1184
+ "codex": ""
1185
+ },
1186
+ "a2a": {
1187
+ "flow": "auto"
1188
+ },
1189
+ "delegation": {
1190
+ "enabled": false
1191
+ }
1192
+ }
1193
+ ```
1194
+
1195
+ ### 環境変数 (env)
1196
+
1197
+ | 変数 | 説明 | デフォルト |
1198
+ |------|------|-----------|
1199
+ | `SYNAPSE_HISTORY_ENABLED` | タスク履歴を有効化 | `false` |
1200
+ | `SYNAPSE_FILE_SAFETY_ENABLED` | ファイル安全機能を有効化 | `false` |
1201
+ | `SYNAPSE_FILE_SAFETY_DB_PATH` | file-safety DB パス | `~/.synapse/file_safety.db` |
1202
+ | `SYNAPSE_AUTH_ENABLED` | API認証を有効化 | `false` |
1203
+ | `SYNAPSE_API_KEYS` | APIキー(カンマ区切り) | - |
1204
+ | `SYNAPSE_ADMIN_KEY` | 管理者キー | - |
1205
+ | `SYNAPSE_ALLOW_LOCALHOST` | localhost認証スキップ | `true` |
1206
+ | `SYNAPSE_USE_HTTPS` | HTTPS使用 | `false` |
1207
+ | `SYNAPSE_WEBHOOK_SECRET` | Webhookシークレット | - |
1208
+ | `SYNAPSE_WEBHOOK_TIMEOUT` | Webhookタイムアウト(秒) | `10` |
1209
+ | `SYNAPSE_WEBHOOK_MAX_RETRIES` | Webhookリトライ数 | `3` |
1210
+
1211
+ ### A2A 通信設定 (a2a)
1212
+
1213
+ エージェント間通信の動作を制御します。
1214
+
1215
+ | 設定 | 値 | 説明 |
1216
+ |------|-----|------|
1217
+ | `flow` | `roundtrip` | 常に結果を待つ |
1218
+ | `flow` | `oneway` | 常に転送のみ(結果を待たない) |
1219
+ | `flow` | `auto` | AIエージェントがタスクに応じて判断(デフォルト) |
1220
+
1221
+ ```json
1222
+ {
1223
+ "a2a": {
1224
+ "flow": "auto"
1225
+ }
1226
+ }
1227
+ ```
1228
+
1229
+ ### 委任設定 (delegation)
1230
+
1231
+ 自動タスク委任を制御します。
1232
+
1233
+ | 設定 | 値 | 説明 |
1234
+ |------|-----|------|
1235
+ | `enabled` | `true` | `.synapse/delegate.md` を読み込み、委任ルールを有効化 |
1236
+ | `enabled` | `false` | 委任を無効化(デフォルト) |
1237
+
1238
+ ```json
1239
+ {
1240
+ "delegation": {
1241
+ "enabled": true
1242
+ }
1243
+ }
1244
+ ```
1245
+
1246
+ 委任を有効にするには、`.synapse/delegate.md` に委任ルールを記述してください。
1247
+
1248
+ ### 初期インストラクション (instructions)
1249
+
1250
+ エージェント起動時に送信される指示をカスタマイズできます。
1251
+
1252
+ ```json
1253
+ {
1254
+ "instructions": {
1255
+ "default": "全エージェント共通の指示",
1256
+ "claude": "Claude専用の指示(設定時はdefaultより優先)",
1257
+ "gemini": "Gemini専用の指示",
1258
+ "codex": "Codex専用の指示"
1259
+ }
1260
+ }
1261
+ ```
1262
+
1263
+ **優先順位**:
1264
+ 1. エージェント固有の設定(`claude`, `gemini`, `codex`)があればそれを使用
1265
+ 2. なければ `default` を使用
1266
+ 3.両方とも空なら初期インストラクションは送信しない
1267
+
1268
+ **プレースホルダー**:
1269
+ - `{{agent_id}}` - エージェントID(例: `synapse-claude-8100`)
1270
+ - `{{port}}` - ポート番号(例: `8100`)
1271
+
1272
+ 詳細は [guides/settings.md](guides/settings.md) を参照してください。
1273
+
1274
+ ---
1275
+
1276
+ ## 開発・リリース
1277
+
1278
+ ### PyPI への公開
1279
+
1280
+ タグをプッシュすると GitHub Actions で自動的に PyPI へ公開されます。
1281
+
1282
+ ```bash
1283
+ # 1. pyproject.toml のバージョンを更新
1284
+ # version = "0.2.0"
1285
+
1286
+ # 2. タグを作成してプッシュ
1287
+ git tag v0.2.0
1288
+ git push origin v0.2.0
1289
+ ```
1290
+
1291
+ ### 手動公開
1292
+
1293
+ ```bash
1294
+ # uv でビルド・公開
1295
+ uv build
1296
+ uv publish
1297
+ ```
1298
+
1299
+ ### ユーザーのインストール方法
1300
+
1301
+ ```bash
1302
+ # pipx(推奨)
1303
+ pipx install synapse-a2a
1304
+
1305
+ # または pip
1306
+ pip install synapse-a2a
1307
+
1308
+ # uvx で直接実行
1309
+ uvx synapse-a2a claude
1310
+ ```
1311
+
1312
+ ---
1313
+
1314
+ ## 既知の制約
1315
+
1316
+ - **TUI 描画**: Ink ベースの CLI で描画が乱れる場合あり
1317
+ - **PTY 制限**: 一部の特殊入力シーケンスは未対応
1318
+ - **Codex サンドボックス**: Codex CLI のサンドボックスがネットワークアクセスをブロックするため、エージェント間通信には設定が必要(下記参照)
1319
+
1320
+ ### Codex CLI でのエージェント間通信
1321
+
1322
+ Codex CLI はデフォルトでサンドボックス内で実行され、ネットワークアクセスが制限されています。`@agent` パターンでのエージェント間通信を使用するには、`~/.codex/config.toml` でネットワークアクセスを許可する必要があります。
1323
+
1324
+ **グローバル設定(全プロジェクトに適用):**
1325
+
1326
+ ```toml
1327
+ # ~/.codex/config.toml
1328
+
1329
+ sandbox_mode = "workspace-write"
1330
+
1331
+ [sandbox_workspace_write]
1332
+ network_access = true
1333
+ ```
1334
+
1335
+ **プロジェクト単位の設定:**
1336
+
1337
+ ```toml
1338
+ # ~/.codex/config.toml
1339
+
1340
+ [projects."/path/to/your/project"]
1341
+ sandbox_mode = "workspace-write"
1342
+
1343
+ [projects."/path/to/your/project".sandbox_workspace_write]
1344
+ network_access = true
1345
+ ```
1346
+
1347
+ 詳細は [guides/troubleshooting.md](guides/troubleshooting.md#codex-サンドボックスでのネットワークエラー) を参照してください。
1348
+
1349
+ ---
1350
+
1351
+ ## エンタープライズ機能
1352
+
1353
+ 本番環境向けのセキュリティ・通知・高性能通信機能を提供します。
1354
+
1355
+ ### API Key 認証
1356
+
1357
+ ```bash
1358
+ # 認証を有効にして起動
1359
+ export SYNAPSE_AUTH_ENABLED=true
1360
+ export SYNAPSE_API_KEYS=my-secret-key
1361
+ synapse claude
1362
+
1363
+ # API Key でリクエスト
1364
+ curl -H "X-API-Key: my-secret-key" http://localhost:8100/tasks
1365
+ ```
1366
+
1367
+ ### Webhook 通知
1368
+
1369
+ タスク完了時に外部 URL へ通知を送信します。
1370
+
1371
+ ```bash
1372
+ # Webhook を登録
1373
+ curl -X POST http://localhost:8100/webhooks \
1374
+ -H "Content-Type: application/json" \
1375
+ -d '{"url": "https://your-server.com/hook", "events": ["task.completed"]}'
1376
+ ```
1377
+
1378
+ | イベント | 説明 |
1379
+ |---------|------|
1380
+ | `task.completed` | タスク正常完了 |
1381
+ | `task.failed` | タスク失敗 |
1382
+ | `task.canceled` | タスクキャンセル |
1383
+
1384
+ ### SSE ストリーミング
1385
+
1386
+ リアルタイムでタスク出力を受信できます。
1387
+
1388
+ ```bash
1389
+ curl -N http://localhost:8100/tasks/{task_id}/subscribe
1390
+ ```
1391
+
1392
+ イベントタイプ:
1393
+
1394
+ | イベント | 説明 |
1395
+ |---------|------|
1396
+ | `output` | 新しい CLI 出力 |
1397
+ | `status` | ステータス変更 |
1398
+ | `done` | タスク完了(Artifact 含む) |
1399
+
1400
+ ### 出力解析
1401
+
1402
+ CLI 出力を自動解析し、エラー検出・ステータス更新・Artifact 生成を行います。
1403
+
1404
+ ```bash
1405
+ # エラー検出 → 自動的に failed ステータス
1406
+ # input_required 検出 → 追加入力待ち状態
1407
+ # 出力パース → コードブロック・ファイル参照を Artifact に変換
1408
+ ```
1409
+
1410
+ | 機能 | 説明 |
1411
+ |------|------|
1412
+ | エラー検出 | `command not found`, `permission denied` 等を検出 |
1413
+ | input_required | 質問・確認プロンプトを検出 |
1414
+ | 出力パーサー | コード/ファイル/エラーを構造化 |
1415
+
1416
+ ### gRPC サポート
1417
+
1418
+ 高性能通信が必要な場合は gRPC を使用できます。
1419
+
1420
+ ```bash
1421
+ # gRPC 依存をインストール
1422
+ pip install synapse-a2a[grpc]
1423
+
1424
+ # gRPC は REST ポート + 1 で起動
1425
+ # REST: 8100 → gRPC: 8101
1426
+ ```
1427
+
1428
+ 詳細は [guides/enterprise.md](guides/enterprise.md) を参照してください。
1429
+
1430
+ ---
1431
+
1432
+ ## ドキュメント
1433
+
1434
+ | パス | 内容 |
1435
+ | -------------------------------------------------------- | ---------------------- |
1436
+ | [guides/usage.md](guides/usage.md) | 使い方詳細 |
1437
+ | [guides/architecture.md](guides/architecture.md) | アーキテクチャ詳細 |
1438
+ | [guides/enterprise.md](guides/enterprise.md) | エンタープライズ機能 |
1439
+ | [guides/troubleshooting.md](guides/troubleshooting.md) | トラブルシューティング |
1440
+ | [guides/delegation.md](guides/delegation.md) | タスク委任ガイド |
1441
+ | [docs/file-safety.md](docs/file-safety.md) | ファイル競合防止機能 |
1442
+ | [docs/project-philosophy.md](docs/project-philosophy.md) | 設計思想 |
1443
+
1444
+ ---
1445
+
1446
+ ## ライセンス
1447
+
1448
+ MIT License
1449
+
1450
+ ---
1451
+
1452
+ ## 関連リンク
1453
+
1454
+ - [Claude Code](https://claude.ai/code) - Anthropic の CLI エージェント
1455
+ - [Google A2A Protocol](https://github.com/google/A2A) - Agent-to-Agent プロトコル