cc-discussion 1.0.0__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.
@@ -0,0 +1,291 @@
1
+ """
2
+ Meeting Prompts
3
+ ===============
4
+
5
+ 会議タイプ別のプロンプトとファシリテーター用プロンプトを定義。
6
+
7
+ Note: This module uses string keys for meeting types to avoid import issues
8
+ when used in subprocess scripts.
9
+ """
10
+
11
+ from typing import Optional, Union
12
+
13
+ # Try to import MeetingType for backwards compatibility with existing code
14
+ # that passes MeetingType enum values
15
+ try:
16
+ from ..models.database import MeetingType
17
+ _HAS_MEETING_TYPE_ENUM = True
18
+ except ImportError:
19
+ _HAS_MEETING_TYPE_ENUM = False
20
+ MeetingType = None # type: ignore
21
+
22
+
23
+ def _normalize_meeting_type(meeting_type: Union[str, "MeetingType", None]) -> Optional[str]:
24
+ """Convert meeting type to string key."""
25
+ if meeting_type is None:
26
+ return None
27
+ if isinstance(meeting_type, str):
28
+ return meeting_type
29
+ # It's an Enum
30
+ return meeting_type.value
31
+
32
+
33
+ # 会議タイプ別プロンプト (using string keys)
34
+ MEETING_TYPE_PROMPTS = {
35
+ "progress_check": """## 会議タイプ: 進捗・状況確認
36
+
37
+ この会議では以下を議論します:
38
+ - 開発進捗の共有
39
+ - スケジュール遅延・ブロッカーの把握
40
+ - 依存関係(他チーム・外部)の確認
41
+
42
+ 議論のポイント:
43
+ 1. 現在の進捗を具体的に共有する
44
+ 2. 予定との差異を明確にする
45
+ 3. ブロッカーや課題を早期に特定する
46
+ 4. 必要なサポートや調整事項を明確にする
47
+ """,
48
+
49
+ "spec_alignment": """## 会議タイプ: 要件・仕様の認識合わせ
50
+
51
+ この会議では以下を議論します:
52
+ - 要件定義・仕様内容の確認
53
+ - 解釈差分・曖昧点の解消
54
+ - 仕様変更の影響範囲確認
55
+
56
+ 議論のポイント:
57
+ 1. 仕様の解釈に相違がないか確認する
58
+ 2. 曖昧な点を具体化・明確化する
59
+ 3. エッジケースや境界条件を洗い出す
60
+ 4. 変更による影響範囲を特定する
61
+ """,
62
+
63
+ "technical_review": """## 会議タイプ: 技術検討・設計判断
64
+
65
+ この会議では以下を議論します:
66
+ - アーキテクチャ・技術選定の検討
67
+ - 実装方針・設計方針の決定
68
+ - トレードオフ(性能・コスト・保守性)の整理
69
+
70
+ 議論のポイント:
71
+ 1. 複数の選択肢を比較検討する
72
+ 2. 各選択肢のメリット・デメリットを明確にする
73
+ 3. 将来の拡張性・保守性を考慮する
74
+ 4. 具体的な判断基準と結論を出す
75
+ """,
76
+
77
+ "issue_resolution": """## 会議タイプ: 課題・不具合対応
78
+
79
+ この会議では以下を議論します:
80
+ - 技術的課題・リスクの洗い出し
81
+ - 不具合の原因分析
82
+ - 対応方針・優先度の決定
83
+
84
+ 議論のポイント:
85
+ 1. 問題の再現手順と影響範囲を確認する
86
+ 2. 根本原因を特定する
87
+ 3. 複数の対応策を検討する
88
+ 4. 対応の優先度とスケジュールを決める
89
+ """,
90
+
91
+ "review": """## 会議タイプ: レビュー
92
+
93
+ この会議では以下を議論します:
94
+ - 設計レビュー
95
+ - 実装レビュー(コード・構成)
96
+ - テスト結果・品質確認
97
+
98
+ 議論のポイント:
99
+ 1. 設計・コードの品質を客観的に評価する
100
+ 2. 改善点を具体的に指摘する
101
+ 3. ベストプラクティスとの比較を行う
102
+ 4. 建設的なフィードバックを心がける
103
+ """,
104
+
105
+ "planning": """## 会議タイプ: 計画・タスク整理
106
+
107
+ この会議では以下を議論します:
108
+ - 開発タスクの分解・整理
109
+ - 担当者・期限の明確化
110
+ - 次スプリント/次フェーズの計画
111
+
112
+ 議論のポイント:
113
+ 1. タスクを適切な粒度に分解する
114
+ 2. 依存関係と優先順位を明確にする
115
+ 3. リスクと対策を事前に検討する
116
+ 4. 現実的なスケジュールを設定する
117
+ """,
118
+
119
+ "release_ops": """## 会議タイプ: リリース・運用判断
120
+
121
+ この会議では以下を議論します:
122
+ - リリース可否判断
123
+ - デプロイ手順・切り戻し確認
124
+ - 運用・監視観点の確認
125
+
126
+ 議論のポイント:
127
+ 1. リリース品質の最終確認を行う
128
+ 2. デプロイ手順とロールバック手順を確認する
129
+ 3. 監視項目とアラート閾値を確認する
130
+ 4. 緊急時の連絡体制を確認する
131
+ """,
132
+
133
+ "retrospective": """## 会議タイプ: 改善・振り返り
134
+
135
+ この会議では以下を議論します:
136
+ - 開発プロセスの振り返り
137
+ - ボトルネック・無駄の特定
138
+ - 改善アクションの決定
139
+
140
+ 議論のポイント:
141
+ 1. 良かった点(Keep)を共有する
142
+ 2. 問題点(Problem)を特定する
143
+ 3. 試してみたいこと(Try)を提案する
144
+ 4. 具体的な改善アクションを決める
145
+ """,
146
+
147
+ "other": """## 会議タイプ: その他
148
+
149
+ {custom_description}
150
+ """,
151
+ }
152
+
153
+
154
+ # 言語指示
155
+ LANGUAGE_INSTRUCTIONS = {
156
+ "ja": "あなたは日本語で議論に参加します。全ての発言は日本語で行ってください。",
157
+ "en": "You participate in the discussion in English. All your responses should be in English.",
158
+ }
159
+
160
+
161
+ # 会議タイプの日本語名
162
+ MEETING_TYPE_NAMES = {
163
+ "progress_check": "進捗・状況確認",
164
+ "spec_alignment": "要件・仕様の認識合わせ",
165
+ "technical_review": "技術検討・設計判断",
166
+ "issue_resolution": "課題・不具合対応",
167
+ "review": "レビュー",
168
+ "planning": "計画・タスク整理",
169
+ "release_ops": "リリース・運用判断",
170
+ "retrospective": "改善・振り返り",
171
+ "other": "その他",
172
+ }
173
+
174
+
175
+ # ファシリテーターシステムプロンプト
176
+ FACILITATOR_SYSTEM_PROMPT = """## ファシリテーター役
177
+
178
+ あなたはこの会議のファシリテーターです。
179
+
180
+ ### 役割
181
+ 1. **会議開始時**: 会議の目的とゴールを説明し、議論のポイントを伝える
182
+ 2. **議論中**: 議論が脱線しないよう軌道修正し、全員が発言できるよう促す
183
+ 3. **会議終了時**: 議論の要点と決定事項をまとめ、次のアクションを明確にする
184
+
185
+ ### 行動指針
186
+ - 中立的な立場を保つ
187
+ - 議論を深める質問を投げかける
188
+ - 合意形成をサポートする
189
+ - 目的とゴールから外れないよう注意する
190
+
191
+ ### コンテキスト
192
+ あなたはこのプロジェクトのコードベースを理解しています。
193
+ 技術的な質問があれば、コードを参照して具体的な情報を提供できます。
194
+ """
195
+
196
+
197
+ # ファシリテーターオープニングテンプレート
198
+ FACILITATOR_OPENING_TEMPLATE = """皆さん、会議を始めましょう。
199
+
200
+ 本日の会議タイプは「{meeting_type_name}」です。
201
+
202
+ ### 本日の目的
203
+ {meeting_type_description}
204
+
205
+ ### 議題
206
+ {topic}
207
+
208
+ ### 参加者
209
+ {participants_list}
210
+
211
+ それでは議論を始めましょう。{first_speaker}さんからお願いします。
212
+ """
213
+
214
+
215
+ # ファシリテータークロージングテンプレート
216
+ FACILITATOR_CLOSING_TEMPLATE = """お疲れ様でした。会議を締めくくります。
217
+
218
+ ### 本日の議論のまとめ
219
+ {summary}
220
+
221
+ ### 決定事項
222
+ {decisions}
223
+
224
+ ### 次のアクション
225
+ {next_actions}
226
+
227
+ 以上で会議を終了します。ありがとうございました。
228
+ """
229
+
230
+
231
+ def get_meeting_type_prompt(
232
+ meeting_type: Union[str, "MeetingType", None],
233
+ custom_description: str = ""
234
+ ) -> str:
235
+ """会議タイプに応じたプロンプトを取得"""
236
+ key = _normalize_meeting_type(meeting_type)
237
+ if key is None:
238
+ return ""
239
+ prompt = MEETING_TYPE_PROMPTS.get(key, "")
240
+ if key == "other" and custom_description:
241
+ return prompt.format(custom_description=custom_description)
242
+ return prompt
243
+
244
+
245
+ def get_language_instruction(language: str) -> str:
246
+ """言語に応じた指示を取得"""
247
+ return LANGUAGE_INSTRUCTIONS.get(language, LANGUAGE_INSTRUCTIONS["ja"])
248
+
249
+
250
+ def get_meeting_type_name(meeting_type: Union[str, "MeetingType", None]) -> str:
251
+ """会議タイプの日本語名を取得"""
252
+ key = _normalize_meeting_type(meeting_type)
253
+ if key is None:
254
+ return "その他"
255
+ return MEETING_TYPE_NAMES.get(key, "その他")
256
+
257
+
258
+ def get_facilitator_opening(
259
+ meeting_type: Union[str, "MeetingType", None],
260
+ topic: str,
261
+ participants: list[str],
262
+ first_speaker: str,
263
+ custom_description: str = ""
264
+ ) -> str:
265
+ """ファシリテーターのオープニングメッセージを生成"""
266
+ meeting_type_name = get_meeting_type_name(meeting_type)
267
+ meeting_type_description = get_meeting_type_prompt(meeting_type, custom_description)
268
+
269
+ # 参加者リストを整形
270
+ participants_list = "\n".join([f"- {p}" for p in participants])
271
+
272
+ return FACILITATOR_OPENING_TEMPLATE.format(
273
+ meeting_type_name=meeting_type_name,
274
+ meeting_type_description=meeting_type_description.strip(),
275
+ topic=topic or "(議題なし)",
276
+ participants_list=participants_list,
277
+ first_speaker=first_speaker,
278
+ )
279
+
280
+
281
+ def get_facilitator_closing(
282
+ summary: str,
283
+ decisions: str,
284
+ next_actions: str
285
+ ) -> str:
286
+ """ファシリテーターのクロージングメッセージを生成"""
287
+ return FACILITATOR_CLOSING_TEMPLATE.format(
288
+ summary=summary,
289
+ decisions=decisions,
290
+ next_actions=next_actions,
291
+ )