cc-discussion 1.0.2__py3-none-any.whl → 1.0.4__py3-none-any.whl

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.
backend/main.py CHANGED
@@ -11,6 +11,7 @@ load_dotenv()
11
11
 
12
12
  import asyncio
13
13
  import logging
14
+ import shutil
14
15
  import sys
15
16
  from contextlib import asynccontextmanager
16
17
  from pathlib import Path
@@ -109,25 +110,19 @@ async def health_check():
109
110
  return {"status": "healthy"}
110
111
 
111
112
 
112
- # SDK availability check
113
+ # CLI availability check
113
114
  @app.get("/api/config/available-agents")
114
115
  async def get_available_agents():
115
- """Check which agent SDKs are installed and available."""
116
+ """Check which CLI tools are installed and available."""
116
117
  available = []
117
118
 
118
- # Check ClaudeCode SDK
119
- try:
120
- from claude_agent_sdk import ClaudeSDKClient
119
+ # Check Claude CLI (claude command)
120
+ if shutil.which("claude"):
121
121
  available.append("claude")
122
- except ImportError:
123
- pass
124
122
 
125
- # Check Codex SDK
126
- try:
127
- from codex_sdk import Codex
123
+ # Check Codex CLI (codex command)
124
+ if shutil.which("codex"):
128
125
  available.append("codex")
129
- except ImportError:
130
- pass
131
126
 
132
127
  return {"available_agents": available}
133
128
 
backend/routers/rooms.py CHANGED
@@ -312,8 +312,10 @@ async def start_discussion(room_id: int, db: Session = Depends(get_db)):
312
312
  if room.status == RoomStatus.ACTIVE:
313
313
  raise HTTPException(status_code=400, detail="Discussion already active")
314
314
 
315
+ # Allow resuming from COMPLETED state (reset to WAITING)
315
316
  if room.status == RoomStatus.COMPLETED:
316
- raise HTTPException(status_code=400, detail="Discussion already completed")
317
+ room.status = RoomStatus.WAITING
318
+ db.commit()
317
319
 
318
320
  return {
319
321
  "status": "ready",
@@ -0,0 +1,382 @@
1
+ Metadata-Version: 2.4
2
+ Name: cc-discussion
3
+ Version: 1.0.4
4
+ Summary: Multi-Claude discussion platform with ClaudeCode context
5
+ Author: nogataka
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/nogataka/cc-discussion
8
+ Project-URL: Repository, https://github.com/nogataka/cc-discussion
9
+ Project-URL: Issues, https://github.com/nogataka/cc-discussion/issues
10
+ Keywords: claude,discussion,ai,multi-agent,codex,openai
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Web Environment
13
+ Classifier: Framework :: FastAPI
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: MIT License
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Requires-Python: >=3.11
22
+ Description-Content-Type: text/markdown
23
+ Requires-Dist: fastapi>=0.115.0
24
+ Requires-Dist: uvicorn[standard]>=0.32.0
25
+ Requires-Dist: sqlalchemy>=2.0.0
26
+ Requires-Dist: python-dotenv>=1.0.0
27
+ Requires-Dist: click>=8.0.0
28
+ Requires-Dist: claude-agent-sdk>=0.0.3
29
+ Requires-Dist: codex-sdk-py>=0.0.3
30
+ Provides-Extra: dev
31
+ Requires-Dist: ruff>=0.8.0; extra == "dev"
32
+ Requires-Dist: mypy>=1.13.0; extra == "dev"
33
+ Requires-Dist: build; extra == "dev"
34
+ Requires-Dist: twine; extra == "dev"
35
+
36
+ # cc-discussion
37
+
38
+ ![Discussion Room Screenshot](docs/assets/screenshot.png)
39
+
40
+ 複数のClaude/Codexインスタンスが、それぞれ異なるClaudeCode/Codex CLIの会話履歴(コンテキスト)を持ちながらディスカッションできるWebアプリケーションです。
41
+
42
+ ## クイックスタート
43
+
44
+ ### インストール不要で実行(推奨)
45
+
46
+ ```bash
47
+ # uvx で即座に実行(Python 3.11以上が必要)
48
+ uvx cc-discussion
49
+ ```
50
+
51
+ ### pip でインストール
52
+
53
+ ```bash
54
+ pip install cc-discussion
55
+ cc-discussion
56
+ ```
57
+
58
+ > **Note**: Claude/Codex エージェントを使用するには、事前に各 CLI ツールのインストールが必要です(下記「必要要件」参照)。
59
+
60
+ ### 起動オプション
61
+
62
+ ```bash
63
+ cc-discussion --help
64
+
65
+ # カスタムポート
66
+ cc-discussion --port 9000
67
+
68
+ # ブラウザを自動で開かない
69
+ cc-discussion --no-browser
70
+
71
+ # 開発モード(ホットリロード)
72
+ cc-discussion --reload
73
+ ```
74
+
75
+ 起動後、ブラウザが自動で `http://127.0.0.1:8888` を開きます。
76
+
77
+ ---
78
+
79
+ ## 必要要件
80
+
81
+ | 要件 | 説明 |
82
+ |------|------|
83
+ | **Python 3.11+** | 必須 |
84
+ | **Claude CLI** | Claude エージェントを使用する場合(インストール・ログイン済み) |
85
+ | **Codex CLI** | Codex エージェントを使用する場合(オプション) |
86
+
87
+ ### Claude CLI のセットアップ
88
+
89
+ ```bash
90
+ # Claude CLI をインストール(https://claude.ai/download)
91
+ # インストール後、ログイン
92
+ claude login
93
+ ```
94
+
95
+ ---
96
+
97
+ ## 概要
98
+
99
+ Slackのような会議室を作成し、2〜3人のClaude/Codexを招待してディスカッションさせることができます。各Claude/Codexには過去のClaudeCode/Codex会話履歴を注入できるため、人間がコンテキストを橋渡しする必要なく、問題解決や状況確認を行えます。
100
+
101
+ ### 主な特徴
102
+
103
+ | 機能 | 説明 |
104
+ |------|------|
105
+ | **ClaudeCode/Codex履歴ブラウザ** | `~/.claude/projects/`および`~/.codex/`から過去のセッションを読み込み・選択 |
106
+ | **マルチエージェント会議室** | 2〜3人のClaude/Codex参加者でディスカッション |
107
+ | **コンテキスト注入** | 各エージェントに過去の会話履歴を自動注入 |
108
+ | **リアルタイムストリーミング** | WebSocketでディスカッションをリアルタイム表示 |
109
+ | **並列準備処理** | 次の発言者がバックグラウンドで準備(ファイル読み込み等)を行い、待ち時間を短縮 |
110
+ | **会議タイプ別プロンプト** | 9種類の会議タイプに応じた最適化されたプロンプトを自動適用 |
111
+ | **ファシリテーター機能** | AIファシリテーターが会議を進行・まとめ |
112
+ | **モデレーター介入** | 人間が途中で発言を挿入してディスカッションを誘導可能 |
113
+
114
+ ---
115
+
116
+ ## 使い方
117
+
118
+ ### 1. 会議室を作成
119
+
120
+ 1. 画面左上の「New Room」ボタンをクリック
121
+ 2. 会議設定を入力:
122
+ - **会議室名**: 識別しやすい名前
123
+ - **トピック**: ディスカッションのテーマ(詳細に書くほど良い結果に)
124
+ - **会議タイプ**: 9種類から選択(後述)
125
+ - **最大ターン数**: 会議の長さを制御(デフォルト: 20)
126
+ - **言語**: 日本語 or 英語
127
+ 3. 参加者を設定(2〜3人):
128
+ - **名前**: 表示名(例:Claude A, Claude B)
129
+ - **役割**: 専門性や視点(例:アーキテクト、コードレビュアー)
130
+ - **エージェントタイプ**: Claude または Codex
131
+ - **コンテキスト**: 過去のClaudeCode/Codexセッションを選択(オプション)
132
+ - **ファシリテーター**: チェックすると会議進行役として動作
133
+
134
+ ### 2. 会議タイプ
135
+
136
+ 会議の目的に応じて最適化されたプロンプトが自動適用されます:
137
+
138
+ | タイプ | 用途 | 議論のポイント |
139
+ |--------|------|----------------|
140
+ | **進捗・状況確認** | 開発進捗の共有、スケジュール遅延・ブロッカーの把握 | 現在の進捗、予定との差異、ブロッカー特定 |
141
+ | **要件・仕様の認識合わせ** | 要件定義・仕様内容の確認、解釈差分の解消 | 仕様の解釈確認、曖昧点の明確化、エッジケース |
142
+ | **技術検討・設計判断** | アーキテクチャ・技術選定、実装方針の決定 | 選択肢比較、メリデメ、拡張性・保守性 |
143
+ | **課題・不具合対応** | 技術的課題・リスクの洗い出し、不具合の原因分析 | 再現手順、根本原因、対応策、優先度 |
144
+ | **レビュー** | 設計レビュー、実装レビュー、品質確認 | 品質評価、改善点、ベストプラクティス |
145
+ | **計画・タスク整理** | タスク分解、担当者・期限の明確化 | 粒度、依存関係、優先順位、リスク |
146
+ | **リリース・運用判断** | リリース可否判断、デプロイ手順確認 | 品質確認、ロールバック、監視項目 |
147
+ | **改善・振り返り** | 開発プロセスの振り返り、改善アクション決定 | Keep, Problem, Try |
148
+ | **その他** | カスタム説明を入力して自由に設定 | - |
149
+
150
+ ### 3. コンテキストの選択
151
+
152
+ 各参加者に過去のClaudeCode/Codex会話履歴を注入できます:
153
+
154
+ 1. 参加者フォームで「コンテキストを選択」をクリック
155
+ 2. **ClaudeCode履歴**: `~/.claude/projects/`から読み込み
156
+ 3. **Codex履歴**: `~/.codex/`から読み込み
157
+ 4. プロジェクト → セッションの順に選択
158
+
159
+ 選択したセッションの会話内容が、そのエージェントのシステムプロンプトに注入されます。これにより、エージェントは過去のやり取りを「記憶」した状態で議論に参加できます。
160
+
161
+ ### 4. ディスカッションの実行
162
+
163
+ 1. 会議室を作成後、自動的に会議室ページに移動
164
+ 2. **Start**ボタンでディスカッション開始
165
+ 3. エージェントがラウンドロビン方式で順番に発言
166
+ - ファシリテーターがいる場合:オープニング → 参加者の議論 → クロージング
167
+ - いない場合:参加者のみで議論
168
+ 4. **Pause**で一時停止、**Stop**で終了
169
+
170
+ ### 5. 並列準備処理(Parallel Preparation)
171
+
172
+ Discussion Roomの特徴的な機能として、**並列準備処理**があります:
173
+
174
+ - 現在の発言者が話している間、次の発言者はバックグラウンドで準備
175
+ - 準備中にファイル読み込みやコード検索を実行
176
+ - 準備完了後、即座に発言を開始
177
+ - 待ち時間を大幅に短縮
178
+
179
+ ### 6. モデレーター介入
180
+
181
+ ディスカッション中に人間がモデレーターとして発言を挿入できます:
182
+
183
+ 1. 画面下部のテキストボックスにメッセージを入力
184
+ 2. Enter(またはSendボタン)で送信
185
+ 3. 次のエージェントの発言時にモデレーターメッセージが考慮されます
186
+
187
+ 用途例:
188
+ - 議論の方向性を修正
189
+ - 追加の情報や制約を提供
190
+ - 特定のトピックに焦点を当てるよう指示
191
+
192
+ ---
193
+
194
+ ## データの保存場所
195
+
196
+ | データ | 保存先 |
197
+ |--------|--------|
198
+ | データベース | `~/.cc-discussion/discussion.db` |
199
+ | ClaudeCode履歴 | `~/.claude/projects/` (読み取り専用) |
200
+ | Codex履歴 | `~/.codex/` (読み取り専用) |
201
+
202
+ ---
203
+
204
+ ## 開発者向け
205
+
206
+ ### ソースからの起動
207
+
208
+ ```bash
209
+ # リポジトリをクローン
210
+ git clone https://github.com/nogataka/cc-discussion.git
211
+ cd cc-discussion
212
+
213
+ # 起動スクリプトを使用(初回は自動セットアップ)
214
+ ./start.sh
215
+
216
+ # または開発モード
217
+ ./start.sh --dev
218
+ ```
219
+
220
+ ### 起動スクリプトオプション
221
+
222
+ ```bash
223
+ # 通常起動(プロダクションモード)
224
+ ./start.sh
225
+
226
+ # 開発モード(Viteホットリロード付き)
227
+ ./start.sh --dev
228
+
229
+ # カスタムポート指定
230
+ ./start.sh --port 9000
231
+
232
+ # リモートアクセス許可(セキュリティ注意)
233
+ ./start.sh --host 0.0.0.0
234
+ ```
235
+
236
+ ### バックエンドのみ起動
237
+
238
+ ```bash
239
+ source venv/bin/activate
240
+ python -m uvicorn backend.main:app --reload --port 8888
241
+ ```
242
+
243
+ ### フロントエンドのみ起動
244
+
245
+ ```bash
246
+ cd frontend
247
+ npm run dev
248
+ ```
249
+
250
+ ### ビルド
251
+
252
+ ```bash
253
+ cd frontend
254
+ npm run build
255
+ ```
256
+
257
+ ### コード品質
258
+
259
+ ```bash
260
+ # Python linting
261
+ source venv/bin/activate
262
+ ruff check backend/
263
+ mypy backend/
264
+
265
+ # TypeScript type check
266
+ cd frontend
267
+ npx tsc --noEmit
268
+ ```
269
+
270
+ ---
271
+
272
+ ## 技術スタック
273
+
274
+ ### バックエンド
275
+
276
+ | 技術 | 用途 |
277
+ |------|------|
278
+ | **FastAPI** | 非同期REST API・WebSocket |
279
+ | **SQLAlchemy 2.0** | ORM(宣言的マッピング) |
280
+ | **SQLite** | データベース(設定不要) |
281
+ | **Claude Agent SDK** | Claudeエージェント制御 |
282
+ | **Codex SDK** | Codexエージェント制御 |
283
+
284
+ ### フロントエンド
285
+
286
+ | 技術 | 用途 |
287
+ |------|------|
288
+ | **React 19** | UIフレームワーク |
289
+ | **TypeScript** | 型安全性 |
290
+ | **Vite** | ビルドツール・開発サーバー |
291
+ | **Tailwind CSS v4** | ユーティリティファーストCSS |
292
+ | **Radix UI** | アクセシブルUIコンポーネント |
293
+ | **TanStack Query** | サーバー状態管理 |
294
+
295
+ ---
296
+
297
+ ## トラブルシューティング
298
+
299
+ ### エージェントタイプが選択できない
300
+
301
+ CLI ツールがインストールされていない可能性があります:
302
+
303
+ ```bash
304
+ # Claude CLI をインストール
305
+ # https://claude.ai/download からダウンロード
306
+ claude login
307
+
308
+ # Codex CLI をインストール
309
+ npm install -g @openai/codex
310
+ ```
311
+
312
+ ### Claude CLIが見つからない
313
+
314
+ ```bash
315
+ # Claude CLIをインストール(https://claude.ai/download)
316
+ # ログイン
317
+ claude login
318
+ ```
319
+
320
+ ### ポートが使用中
321
+
322
+ ```bash
323
+ cc-discussion --port 9000
324
+ ```
325
+
326
+ ### データベースのリセット
327
+
328
+ ```bash
329
+ # データベースファイルを削除(全データ消失)
330
+ rm ~/.cc-discussion/discussion.db
331
+ ```
332
+
333
+ ### Windows での実行
334
+
335
+ Windows でも動作します:
336
+
337
+ ```powershell
338
+ uvx cc-discussion
339
+ # または
340
+ pip install cc-discussion
341
+ cc-discussion
342
+ ```
343
+
344
+ データは `C:\Users\<username>\.cc-discussion\` に保存されます。
345
+
346
+ ---
347
+
348
+ ## API リファレンス
349
+
350
+ ### 履歴閲覧API
351
+
352
+ | メソッド | エンドポイント | 説明 |
353
+ |----------|----------------|------|
354
+ | GET | `/api/history/projects` | ClaudeCodeプロジェクト一覧 |
355
+ | GET | `/api/history/projects/{id}/sessions` | セッション一覧 |
356
+ | GET | `/api/history/sessions/{id}` | セッション詳細 |
357
+ | GET | `/api/history/codex/projects` | Codexプロジェクト一覧 |
358
+ | GET | `/api/history/codex/projects/{id}/sessions` | Codexセッション一覧 |
359
+
360
+ ### ルーム管理API
361
+
362
+ | メソッド | エンドポイント | 説明 |
363
+ |----------|----------------|------|
364
+ | POST | `/api/rooms` | ルーム作成 |
365
+ | GET | `/api/rooms` | ルーム一覧 |
366
+ | GET | `/api/rooms/{id}` | ルーム詳細 |
367
+ | DELETE | `/api/rooms/{id}` | ルーム削除 |
368
+ | POST | `/api/rooms/{id}/start` | ディスカッション開始 |
369
+ | POST | `/api/rooms/{id}/pause` | 一時停止 |
370
+ | POST | `/api/rooms/{id}/moderate` | モデレーター発言 |
371
+
372
+ ### WebSocket
373
+
374
+ | エンドポイント | 説明 |
375
+ |----------------|------|
376
+ | `WS /ws/rooms/{id}` | リアルタイム更新 |
377
+
378
+ ---
379
+
380
+ ## ライセンス
381
+
382
+ MIT License
@@ -1,13 +1,13 @@
1
1
  backend/__init__.py,sha256=y97v5_UdtKzPNlbudD_L41en48aNR9GB0IJ9atJu-Ew,37
2
2
  backend/__main__.py,sha256=z_QVgbG4Qns2lZr5IWmbrYXUgAhbHXQB-vu4_OuUIQ4,119
3
3
  backend/cli.py,sha256=U5uqmpab_t7SVFL3Y4UgQqEQ2ZWuwDgCKHvjDjby1kQ,1449
4
- backend/main.py,sha256=w44n9duN8zI7oGD3rWAV48hlXcLhDlDnq0bfwNyBops,4475
4
+ backend/main.py,sha256=4Hiaoian0YzLy2YE9cLOBXSArgp8scGUUFFvWEmTK98,4397
5
5
  backend/websocket.py,sha256=MgKbXaLIOhC8M1R7JJoZ3NCs8S9ZpqmJJkcbWEgrHak,9581
6
6
  backend/models/__init__.py,sha256=BQ3qqa1h1lTTfl1jbp97BzE3yvSb0UhKI1fxUZ48IGE,141
7
7
  backend/models/database.py,sha256=xwj2iTYdzXwVv2LhvUaK-PdDx5EpZ2x0vjtabfE8beM,8208
8
8
  backend/routers/__init__.py,sha256=LxZxYnqJ8lXVpPwCACRqFxAAw6omg6ISeSo3EjC5Fi4,134
9
9
  backend/routers/history.py,sha256=co4Ruvz97XOI9p44NoDl3Rw3K0_YFZL0FUnUhbftu0A,5485
10
- backend/routers/rooms.py,sha256=C_gnM8SdWUZU1LDqjSWc__U-HH8makz4impj4Qzc1e0,11288
10
+ backend/routers/rooms.py,sha256=IdswEYl-DFK_8is6282En41JufTMufOU5z4CusY1lbY,11326
11
11
  backend/services/__init__.py,sha256=1Rf_Bz3rS6DwDx7EkAEMsStiKx0iOeuz_vvyKbhkoJE,43
12
12
  backend/services/codex_agent.py,sha256=ehx5U3jkCaLsgOwg2B3sAWvYLS5YWioQ3TdM2RwNAto,11858
13
13
  backend/services/codex_history_reader.py,sha256=a7zlfWXfoeKg-FuAkEj2azVjQHeSjnlsLgyZs7vzrbE,9803
@@ -23,8 +23,8 @@ backend/static/assets/index-VJBoI-hP.css,sha256=fWJjHYBjJrX8GqLsY1_-gYraM2ThpT7A
23
23
  backend/static/assets/vendor-query-b54G1vTo.js,sha256=t_bZMbh6W1n_U5AeG6ujgPLR5aiwmbBCvOgCVc21sVI,35661
24
24
  backend/static/assets/vendor-react-BXXBRvhI.js,sha256=CX2NLGw6YdSjTJBejWqA8M1-p97AYh_ZYtt8dpkwmss,47109
25
25
  backend/static/assets/vendor-ui-DmKgA75E.js,sha256=oU4ONxMcPBFwUZtEIjofALzbPI1T6mzFLqeG8Rdb6AU,38546
26
- cc_discussion-1.0.2.dist-info/METADATA,sha256=GCTjGBjStYna4jX6y64C1IN8bYllJzOUlLzy69ClvHI,25865
27
- cc_discussion-1.0.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
28
- cc_discussion-1.0.2.dist-info/entry_points.txt,sha256=fGx5agzzru7s5NAwuXyB9zNYkiTHihNH4Dzc8kkwRLQ,51
29
- cc_discussion-1.0.2.dist-info/top_level.txt,sha256=o0r_qMzzBDDtK9APrv2QVcIw9oc00JRmCEsTE2-AFr0,8
30
- cc_discussion-1.0.2.dist-info/RECORD,,
26
+ cc_discussion-1.0.4.dist-info/METADATA,sha256=WkP3yVmrnzvVaK-9CJYcaJAeqJrOOZaDSO1qjDhLpkw,12639
27
+ cc_discussion-1.0.4.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
28
+ cc_discussion-1.0.4.dist-info/entry_points.txt,sha256=fGx5agzzru7s5NAwuXyB9zNYkiTHihNH4Dzc8kkwRLQ,51
29
+ cc_discussion-1.0.4.dist-info/top_level.txt,sha256=o0r_qMzzBDDtK9APrv2QVcIw9oc00JRmCEsTE2-AFr0,8
30
+ cc_discussion-1.0.4.dist-info/RECORD,,
@@ -1,527 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: cc-discussion
3
- Version: 1.0.2
4
- Summary: Multi-Claude discussion platform with ClaudeCode context
5
- Author: nogataka
6
- License: MIT
7
- Project-URL: Homepage, https://github.com/nogataka/cc-discussion
8
- Project-URL: Repository, https://github.com/nogataka/cc-discussion
9
- Project-URL: Issues, https://github.com/nogataka/cc-discussion/issues
10
- Keywords: claude,discussion,ai,multi-agent,codex,openai
11
- Classifier: Development Status :: 4 - Beta
12
- Classifier: Environment :: Web Environment
13
- Classifier: Framework :: FastAPI
14
- Classifier: Intended Audience :: Developers
15
- Classifier: License :: OSI Approved :: MIT License
16
- Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.11
18
- Classifier: Programming Language :: Python :: 3.12
19
- Classifier: Programming Language :: Python :: 3.13
20
- Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
- Requires-Python: >=3.11
22
- Description-Content-Type: text/markdown
23
- Requires-Dist: fastapi>=0.115.0
24
- Requires-Dist: uvicorn[standard]>=0.32.0
25
- Requires-Dist: sqlalchemy>=2.0.0
26
- Requires-Dist: python-dotenv>=1.0.0
27
- Requires-Dist: click>=8.0.0
28
- Provides-Extra: claude
29
- Requires-Dist: claude-agent-sdk>=0.0.3; extra == "claude"
30
- Provides-Extra: codex
31
- Requires-Dist: codex-sdk-py>=0.0.3; extra == "codex"
32
- Provides-Extra: all
33
- Requires-Dist: claude-agent-sdk>=0.0.3; extra == "all"
34
- Requires-Dist: codex-sdk-py>=0.0.3; extra == "all"
35
- Provides-Extra: dev
36
- Requires-Dist: ruff>=0.8.0; extra == "dev"
37
- Requires-Dist: mypy>=1.13.0; extra == "dev"
38
- Requires-Dist: build; extra == "dev"
39
- Requires-Dist: twine; extra == "dev"
40
-
41
- # Discussion Room
42
-
43
- ![Discussion Room Screenshot](docs/assets/screenshot.png)
44
-
45
- 複数のClaude/Codexインスタンスが、それぞれ異なるClaudeCode/Codex CLIの会話履歴(コンテキスト)を持ちながらディスカッションできるWebアプリケーションです。
46
-
47
- ## 概要
48
-
49
- Slackのような会議室を作成し、2〜3人のClaude/Codexを招待してディスカッションさせることができます。各Claude/Codexには過去のClaudeCode/Codex会話履歴を注入できるため、人間がコンテキストを橋渡しする必要なく、問題解決や状況確認を行えます。
50
-
51
- ### 主な特徴
52
-
53
- | 機能 | 説明 |
54
- | -------------------------------- | ------------------------------------------------------------------------------ |
55
- | **ClaudeCode/Codex履歴ブラウザ** | `~/.claude/projects/`および`~/.codex/`から過去のセッションを読み込み・選択 |
56
- | **マルチエージェント会議室** | 2〜3人のClaude/Codex参加者でディスカッション |
57
- | **コンテキスト注入** | 各エージェントに過去の会話履歴を自動注入 |
58
- | **リアルタイムストリーミング** | WebSocketでディスカッションをリアルタイム表示 |
59
- | **並列準備処理** | 次の発言者がバックグラウンドで準備(ファイル読み込み等)を行い、待ち時間を短縮 |
60
- | **会議タイプ別プロンプト** | 9種類の会議タイプに応じた最適化されたプロンプトを自動適用 |
61
- | **ファシリテーター機能** | AIファシリテーターが会議を進行・まとめ |
62
- | **モデレーター介入** | 人間が途中で発言を挿入してディスカッションを誘導可能 |
63
-
64
- ## 必要要件
65
-
66
- - Python 3.11以上
67
- - Node.js 20.19以上 または 22.12以上
68
- - Claude CLI(インストール済み&ログイン済み)
69
- - Codex CLI(オプション:Codexエージェントを使用する場合)
70
-
71
- ## インストール・起動
72
-
73
- ```bash
74
- # リポジトリに移動
75
- cd /path/to/cc-discussion
76
-
77
- # 起動(初回は自動的にセットアップされます)
78
- ./start.sh
79
- ```
80
-
81
- ### 起動オプション
82
-
83
- ```bash
84
- # 通常起動(プロダクションモード)
85
- ./start.sh
86
-
87
- # 開発モード(Viteホットリロード付き)
88
- ./start.sh --dev
89
-
90
- # カスタムポート指定
91
- ./start.sh --port 9000
92
-
93
- # リモートアクセス許可(セキュリティ注意)
94
- ./start.sh --host 0.0.0.0
95
- ```
96
-
97
- 起動スクリプトは以下を自動的に行います:
98
- 1. Python仮想環境の作成
99
- 2. Python依存関係のインストール
100
- 3. npm依存関係のインストール
101
- 4. Reactフロントエンドのビルド
102
- 5. サーバー起動(デフォルト: http://127.0.0.1:8888)
103
- 6. ブラウザを自動で開く
104
-
105
- ---
106
-
107
- ## 使い方
108
-
109
- ### 1. 会議室を作成
110
-
111
- 1. 画面左上の「New Room」ボタンをクリック
112
- 2. 会議設定を入力:
113
- - **会議室名**: 識別しやすい名前
114
- - **トピック**: ディスカッションのテーマ(詳細に書くほど良い結果に)
115
- - **会議タイプ**: 9種類から選択(後述)
116
- - **最大ターン数**: 会議の長さを制御(デフォルト: 20)
117
- - **言語**: 日本語 or 英語
118
- 3. 参加者を設定(2〜3人):
119
- - **名前**: 表示名(例:Claude A, Claude B)
120
- - **役割**: 専門性や視点(例:アーキテクト、コードレビュアー)
121
- - **エージェントタイプ**: Claude または Codex
122
- - **コンテキスト**: 過去のClaudeCode/Codexセッションを選択(オプション)
123
- - **ファシリテーター**: チェックすると会議進行役として動作
124
-
125
- ### 2. 会議タイプ
126
-
127
- 会議の目的に応じて最適化されたプロンプトが自動適用されます:
128
-
129
- | タイプ | 用途 | 議論のポイント |
130
- | -------------------------- | -------------------------------------------------- | -------------------------------------------- |
131
- | **進捗・状況確認** | 開発進捗の共有、スケジュール遅延・ブロッカーの把握 | 現在の進捗、予定との差異、ブロッカー特定 |
132
- | **要件・仕様の認識合わせ** | 要件定義・仕様内容の確認、解釈差分の解消 | 仕様の解釈確認、曖昧点の明確化、エッジケース |
133
- | **技術検討・設計判断** | アーキテクチャ・技術選定、実装方針の決定 | 選択肢比較、メリデメ、拡張性・保守性 |
134
- | **課題・不具合対応** | 技術的課題・リスクの洗い出し、不具合の原因分析 | 再現手順、根本原因、対応策、優先度 |
135
- | **レビュー** | 設計レビュー、実装レビュー、品質確認 | 品質評価、改善点、ベストプラクティス |
136
- | **計画・タスク整理** | タスク分解、担当者・期限の明確化 | 粒度、依存関係、優先順位、リスク |
137
- | **リリース・運用判断** | リリース可否判断、デプロイ手順確認 | 品質確認、ロールバック、監視項目 |
138
- | **改善・振り返り** | 開発プロセスの振り返り、改善アクション決定 | Keep, Problem, Try |
139
- | **その他** | カスタム説明を入力して自由に設定 | - |
140
-
141
- ### 3. コンテキストの選択
142
-
143
- 各参加者に過去のClaudeCode/Codex会話履歴を注入できます:
144
-
145
- 1. 参加者フォームで「Select History」をクリック
146
- 2. **ClaudeCode履歴**: `~/.claude/projects/`から読み込み
147
- 3. **Codex履歴**: `~/.codex/`から読み込み
148
- 4. プロジェクト → セッションの順に選択
149
-
150
- 選択したセッションの会話内容が、そのエージェントのシステムプロンプトに注入されます。これにより、エージェントは過去のやり取りを「記憶」した状態で議論に参加できます。
151
-
152
- ### 4. ディスカッションの実行
153
-
154
- 1. 会議室を作成後、自動的に会議室ページに移動
155
- 2. **Start**ボタンでディスカッション開始
156
- 3. エージェントがラウンドロビン方式で順番に発言
157
- - ファシリテーターがいる場合:オープニング → 参加者の議論 → クロージング
158
- - いない場合:参加者のみで議論
159
- 4. **Pause**で一時停止、**Stop**で終了
160
-
161
- ### 5. 並列準備処理(Parallel Preparation)
162
-
163
- Discussion Roomの特徴的な機能として、**並列準備処理**があります:
164
-
165
- - 現在の発言者が話している間、次の発言者はバックグラウンドで準備
166
- - 準備中にファイル読み込みやコード検索を実行
167
- - 準備完了後、即座に発言を開始
168
- - 待ち時間を大幅に短縮
169
-
170
- ### 6. モデレーター介入
171
-
172
- ディスカッション中に人間がモデレーターとして発言を挿入できます:
173
-
174
- 1. 画面下部のテキストボックスにメッセージを入力
175
- 2. Enter(またはSendボタン)で送信
176
- 3. 次のエージェントの発言時にモデレーターメッセージが考慮されます
177
-
178
- 用途例:
179
- - 議論の方向性を修正
180
- - 追加の情報や制約を提供
181
- - 特定のトピックに焦点を当てるよう指示
182
-
183
- ---
184
-
185
- ## 技術スタック
186
-
187
- ### バックエンド
188
-
189
- | 技術 | 用途 |
190
- | -------------------- | ------------------------- |
191
- | **FastAPI** | 非同期REST API・WebSocket |
192
- | **SQLAlchemy 2.0** | ORM(宣言的マッピング) |
193
- | **SQLite** | データベース(設定不要) |
194
- | **Claude Agent SDK** | Claudeエージェント制御 |
195
- | **Codex SDK** | Codexエージェント制御 |
196
- | **Pydantic** | リクエスト/レスポンス検証 |
197
-
198
- ### フロントエンド
199
-
200
- | 技術 | 用途 |
201
- | ------------------- | ------------------------------------ |
202
- | **React 19** | UIフレームワーク |
203
- | **TypeScript** | 型安全性 |
204
- | **Vite** | ビルドツール・開発サーバー |
205
- | **Tailwind CSS v4** | ユーティリティファーストCSS |
206
- | **Radix UI** | アクセシブルUIコンポーネント |
207
- | **TanStack Query** | サーバー状態管理・データフェッチング |
208
- | **React Router** | クライアントサイドルーティング |
209
- | **Lucide React** | アイコン |
210
-
211
- ---
212
-
213
- ## アーキテクチャ
214
-
215
- ### システム構成図
216
-
217
- ```
218
- ┌─────────────────────────────────────────────────────────────────┐
219
- │ Frontend (React) │
220
- ├─────────────────────────────────────────────────────────────────┤
221
- │ RoomPage.tsx │ CreateRoomModal.tsx │ Slack-UI │
222
- │ - メッセージ表示 │ - 会議室作成 │ - メッセージ │
223
- │ - WebSocket接続 │ - 参加者設定 │ - サイドバー │
224
- │ - コントロール │ - 履歴選択 │ - ステータス │
225
- └────────────┬───────────┴───────────┬───────────┴────────────────┘
226
- │ HTTP/REST │ WebSocket
227
- ▼ ▼
228
- ┌─────────────────────────────────────────────────────────────────┐
229
- │ Backend (FastAPI) │
230
- ├─────────────────────────────────────────────────────────────────┤
231
- │ main.py │ rooms.py │ history.py │
232
- │ - アプリ初期化 │ - ルームCRUD │ - 履歴API │
233
- │ - 静的ファイル配信 │ - 制御API │ - プロジェクト │
234
- │ - ライフサイクル │ - モデレーター │ - セッション │
235
- ├─────────────────────────────────────────────────────────────────┤
236
- │ websocket.py │
237
- │ - WebSocket接続管理 - リアルタイム配信 - ルーム別ブロード │
238
- └────────────────────────────┬────────────────────────────────────┘
239
-
240
-
241
- ┌─────────────────────────────────────────────────────────────────┐
242
- │ Services (オーケストレーション) │
243
- ├─────────────────────────────────────────────────────────────────┤
244
- │ parallel_orchestrator.py │ discussion_orchestrator.py │
245
- │ - 並列準備処理 │ - 逐次処理(フォールバック)│
246
- │ - バックグラウンド準備 │ │
247
- │ - イベントキュー │ │
248
- ├─────────────────────────────────────────────────────────────────┤
249
- │ participant_agent.py │ codex_agent.py │
250
- │ - Claude Agent SDK │ - Codex SDK │
251
- │ - サブプロセス実行 │ - サブプロセス実行 │
252
- ├─────────────────────────────────────────────────────────────────┤
253
- │ history_reader.py │ codex_history_reader.py │
254
- │ - ClaudeCode履歴読み込み │ - Codex履歴読み込み │
255
- │ - JSONL解析 │ - JSONL解析 │
256
- ├─────────────────────────────────────────────────────────────────┤
257
- │ meeting_prompts.py │
258
- │ - 会議タイプ別プロンプト - ファシリテータープロンプト │
259
- └─────────────────────────────────────────────────────────────────┘
260
-
261
-
262
- ┌─────────────────────────────────────────────────────────────────┐
263
- │ Database (SQLite) │
264
- ├─────────────────────────────────────────────────────────────────┤
265
- │ DiscussionRoom │ RoomParticipant │ DiscussionMessage│
266
- │ - name, topic │ - name, role │ - role, content │
267
- │ - status │ - context_* │ - turn_number │
268
- │ - meeting_type │ - is_facilitator │ - created_at │
269
- │ - max_turns │ - agent_type │ │
270
- └─────────────────────────────────────────────────────────────────┘
271
- ```
272
-
273
- ### ディスカッションフロー
274
-
275
- ```
276
- 1. ルーム作成
277
- └─> 参加者登録 → コンテキスト読み込み → DB保存
278
-
279
- 2. ディスカッション開始 (POST /api/rooms/{id}/start)
280
- └─> Orchestrator初期化 → 参加者エージェント生成
281
-
282
- 3. ターン実行 (並列準備処理)
283
- ┌─────────────────────────────────────────────────────┐
284
- │ [発言者A] Speaking ──────────────────────────────► │
285
- │ [発言者B] ──── Preparing (background) ─────────► │
286
- │ [発言者C] ──────────── Preparing (background) ──► │
287
- └─────────────────────────────────────────────────────┘
288
-
289
- 各ターン:
290
- a. 現在の発言者がレスポンス生成(ストリーミング)
291
- b. 次の2名がバックグラウンドで準備
292
- c. WebSocket経由でリアルタイム配信
293
- d. DB保存 → 次の発言者へ
294
-
295
- 4. 完了/一時停止
296
- └─> ステータス更新 → クリーンアップ
297
- ```
298
-
299
- ### データベースモデル
300
-
301
- ```
302
- DiscussionRoom (会議室)
303
- ├── id: Integer (PK)
304
- ├── name: String(200)
305
- ├── topic: Text (nullable)
306
- ├── status: Enum(waiting/active/paused/completed)
307
- ├── meeting_type: Enum(9種類)
308
- ├── custom_meeting_description: Text (nullable)
309
- ├── language: String(10) = "ja"
310
- ├── max_turns: Integer = 20
311
- ├── current_turn: Integer = 0
312
- ├── created_at: DateTime
313
- └── updated_at: DateTime
314
-
315
- RoomParticipant (参加者)
316
- ├── id: Integer (PK)
317
- ├── room_id: Integer (FK → DiscussionRoom)
318
- ├── name: String(50)
319
- ├── role: String(100) (nullable)
320
- ├── color: String(7) = "#6366f1"
321
- ├── context_project_dir: String(500) (nullable)
322
- ├── context_session_id: String(100) (nullable)
323
- ├── context_summary: Text (nullable)
324
- ├── is_speaking: Boolean = False
325
- ├── message_count: Integer = 0
326
- ├── is_facilitator: Boolean = False
327
- └── agent_type: Enum(claude/codex) = claude
328
-
329
- DiscussionMessage (メッセージ)
330
- ├── id: Integer (PK)
331
- ├── room_id: Integer (FK → DiscussionRoom)
332
- ├── participant_id: Integer (FK → RoomParticipant, nullable)
333
- ├── role: String(20) = system/participant/moderator
334
- ├── content: Text
335
- ├── extra_data: JSON (nullable)
336
- ├── turn_number: Integer
337
- └── created_at: DateTime
338
- ```
339
-
340
- ---
341
-
342
- ## プロジェクト構造
343
-
344
- ```
345
- cc-discussion/
346
- ├── backend/ # バックエンド(Python/FastAPI)
347
- │ ├── main.py # FastAPIエントリポイント
348
- │ ├── websocket.py # WebSocketハンドラ
349
- │ ├── models/
350
- │ │ └── database.py # SQLAlchemyモデル・Enum定義
351
- │ ├── routers/
352
- │ │ ├── history.py # 履歴閲覧API
353
- │ │ └── rooms.py # ルームCRUD API
354
- │ └── services/
355
- │ ├── parallel_orchestrator.py # 並列準備オーケストレーター
356
- │ ├── discussion_orchestrator.py# 逐次オーケストレーター
357
- │ ├── participant_agent.py # Claudeエージェント
358
- │ ├── codex_agent.py # Codexエージェント
359
- │ ├── history_reader.py # ClaudeCode履歴パーサー
360
- │ ├── codex_history_reader.py # Codex履歴パーサー
361
- │ └── meeting_prompts.py # 会議タイプ別プロンプト
362
-
363
- ├── frontend/ # フロントエンド(React/TypeScript)
364
- │ ├── src/
365
- │ │ ├── App.tsx # メインアプリ・ルーティング
366
- │ │ ├── main.tsx # エントリポイント
367
- │ │ ├── pages/
368
- │ │ │ └── RoomPage.tsx # ディスカッション表示
369
- │ │ ├── components/
370
- │ │ │ ├── CreateRoomModal.tsx # ルーム作成モーダル
371
- │ │ │ ├── ParticipantAvatar.tsx # 参加者アバター
372
- │ │ │ ├── ErrorBoundary.tsx # エラーハンドリング
373
- │ │ │ ├── slack-ui/ # Slack風UIコンポーネント
374
- │ │ │ │ ├── ChannelSidebar.tsx
375
- │ │ │ │ ├── MessageList.tsx
376
- │ │ │ │ ├── MessageGroup.tsx
377
- │ │ │ │ ├── MessageInput.tsx
378
- │ │ │ │ ├── RoomHeader.tsx
379
- │ │ │ │ └── StatusIndicator.tsx
380
- │ │ │ └── ui/ # 汎用UIコンポーネント(shadcn/ui)
381
- │ │ ├── hooks/
382
- │ │ │ └── useRoomWebSocket.ts # WebSocket状態管理
383
- │ │ └── lib/
384
- │ │ └── api.ts # APIクライアント
385
- │ ├── index.html
386
- │ ├── vite.config.ts
387
- │ ├── tailwind.config.ts
388
- │ └── package.json
389
-
390
- ├── start.sh # 起動スクリプト(Unix)
391
- ├── start_ui.py # Pythonランチャー
392
- ├── requirements.txt # Python依存関係
393
- ├── pyproject.toml # Python設定
394
- ├── .env.example # 環境変数テンプレート
395
- ├── .gitignore # Git除外設定
396
- └── discussion.db # SQLiteデータベース(自動生成)
397
- ```
398
-
399
- ---
400
-
401
- ## API リファレンス
402
-
403
- ### 履歴閲覧API
404
-
405
- | メソッド | エンドポイント | 説明 |
406
- | -------- | ------------------------------------------- | -------------------------- |
407
- | GET | `/api/history/projects` | ClaudeCodeプロジェクト一覧 |
408
- | GET | `/api/history/projects/{id}/sessions` | セッション一覧 |
409
- | GET | `/api/history/sessions/{id}` | セッション詳細 |
410
- | GET | `/api/history/codex/projects` | Codexプロジェクト一覧 |
411
- | GET | `/api/history/codex/projects/{id}/sessions` | Codexセッション一覧 |
412
-
413
- ### ルーム管理API
414
-
415
- | メソッド | エンドポイント | 説明 |
416
- | -------- | -------------------------- | ------------------------------------ |
417
- | POST | `/api/rooms` | ルーム作成 |
418
- | GET | `/api/rooms` | ルーム一覧 |
419
- | GET | `/api/rooms/{id}` | ルーム詳細(参加者・メッセージ含む) |
420
- | DELETE | `/api/rooms/{id}` | ルーム削除 |
421
- | POST | `/api/rooms/{id}/start` | ディスカッション開始 |
422
- | POST | `/api/rooms/{id}/pause` | 一時停止 |
423
- | POST | `/api/rooms/{id}/moderate` | モデレーター発言 |
424
-
425
- ### WebSocket
426
-
427
- | エンドポイント | 説明 |
428
- | ------------------- | ---------------------------------------------------- |
429
- | `WS /ws/rooms/{id}` | リアルタイム更新(メッセージ・ステータス・準備状況) |
430
-
431
- **WebSocketイベントタイプ:**
432
- - `message`: 新規メッセージ
433
- - `status_change`: ルームステータス変更
434
- - `participant_speaking`: 発言者変更
435
- - `preparation_activity`: 準備中のアクティビティ
436
- - `preparation_complete`: 準備完了
437
-
438
- ---
439
-
440
- ## 開発
441
-
442
- ### バックエンドのみ起動
443
-
444
- ```bash
445
- source venv/bin/activate
446
- python -m uvicorn backend.main:app --reload --port 8888
447
- ```
448
-
449
- ### フロントエンドのみ起動
450
-
451
- ```bash
452
- cd frontend
453
- npm run dev
454
- ```
455
-
456
- ### ビルド
457
-
458
- ```bash
459
- cd frontend
460
- npm run build
461
- ```
462
-
463
- ### コード品質
464
-
465
- ```bash
466
- # Python linting
467
- source venv/bin/activate
468
- ruff check backend/
469
- mypy backend/
470
-
471
- # TypeScript type check
472
- cd frontend
473
- npx tsc --noEmit
474
- ```
475
-
476
- ---
477
-
478
- ## トラブルシューティング
479
-
480
- ### Claude CLIが見つからない
481
-
482
- ```bash
483
- # Claude CLIをインストール
484
- # https://claude.ai/download からダウンロード
485
-
486
- # ログイン
487
- claude login
488
- ```
489
-
490
- ### ポートが使用中
491
-
492
- ```bash
493
- # 別のポートを指定
494
- ./start.sh --port 9000
495
- ```
496
-
497
- ### 仮想環境の問題
498
-
499
- ```bash
500
- # 仮想環境を削除して再作成
501
- rm -rf venv
502
- ./start.sh
503
- ```
504
-
505
- ### データベースのリセット
506
-
507
- ```bash
508
- # データベースファイルを削除(全データ消失)
509
- rm discussion.db
510
- ./start.sh
511
- ```
512
-
513
- ### Node.jsバージョンの問題
514
-
515
- Vite 7.x は Node.js 20.19+ または 22.12+ を要求します。
516
-
517
- ```bash
518
- # nvm使用時
519
- nvm install 22
520
- nvm use 22
521
- ```
522
-
523
- ---
524
-
525
- ## ライセンス
526
-
527
- MIT License