本ドキュメントは、コーディングエージェント(coding_agent)プロジェクトの全体仕様を統合したものです。各機能の詳細については、それぞれの個別仕様書を参照してください。
GitHub Copilot Coding Agentのようなコーディングエージェントを作成します。GitHubおよびGitLabにラベル付けされたIssue、Pull Request、Merge Requestをタスクとして処理し、LLM(大規模言語モデル)を活用して自動的にコード変更や対応を行います。
- GitHub: Issue、Pull Requestの処理
- GitLab: Issue、Merge Requestの処理
- タスク取得: GitHub/GitLabから特定ラベルが付与されたIssue/PR/MRをタスクとして取得
- LLM対話: OpenAI、Ollama、LM Studio等のLLMプロバイダーと連携
- MCP連携: Model Context Protocol(MCP)サーバーを通じてGitHub/GitLabの操作を実行
- プランニングモード: タスクを段階的に分解し、計画的に実行
- コンテキスト管理: 会話履歴の管理と自動圧縮
- 一時停止・再開: タスク処理の一時停止と状態保存からの再開
- タスク停止: アサイン解除によるタスクの停止
- 継続動作モード: Docker Composeによる継続的なタスク処理
- ユーザー設定管理: ユーザーごとのLLM設定の管理
- Issue→MR/PR変換: Issueで依頼された内容を自動的にMR/PRとして作成
- 実行環境管理: 複数言語対応のDocker実行環境でコマンドを実行
- テキストエディタ連携: ファイル編集をtext-editor MCPで行い、gitで管理
- OS: macOS、Linux(Docker使用時はWindowsも対応)
- 言語: Python 3.13以上
- 起動方法: Docker Compose(継続動作)またはcron(定期実行)
- Python標準ロガーを使用
- ログはファイルにのみ出力し、デイリーでローテーションして圧縮
- MCPサーバーはDockerでstdioモードで起動
- PostgreSQL: タスク情報の永続化
- RabbitMQ: タスクキュー管理(オプション)
本システムは以下のコンポーネントで構成されています:
- main.py: メインエントリーポイント、Producer/Consumerモードの制御
- TaskGetter: GitHub/GitLabからタスクを取得する抽象クラスと具象クラス
- Task: タスクを表現する抽象クラスと具象クラス(Issue/PR/MR対応)
- TaskHandler: タスク処理のオーケストレーション
- PlanningCoordinator: プランニングモードでのタスク実行制御
- LLMClient: 各LLMプロバイダーへのインターフェース
- MCPToolClient: MCPサーバーとの通信クライアント
- TaskQueue: タスクキュー管理(インメモリまたはRabbitMQ)
- TaskContextManager: タスクのコンテキスト管理とデータベース操作
- ExecutionEnvironmentManager: Docker実行環境の管理
flowchart TD
A[起動] --> B[MCPサーバー起動]
B --> C[TaskGetter.get_task_list]
C --> D{タスクあり?}
D -->|No| E[終了]
D -->|Yes| F[タスクをキューに投入]
F --> G[キューからタスク取得]
G --> H[Task.prepare]
H --> I{プランニングモード?}
I -->|Yes| J[PlanningCoordinator実行]
I -->|No| K[TaskHandler実行]
J --> L[Task.finish]
K --> L
L --> M{次のタスク?}
M -->|Yes| G
M -->|No| E
すべての設定項目はconfig.yamlに定義します。主要な設定項目:
- task_source: タスクソース(github/gitlab)
- llm: LLMプロバイダー設定(openai/ollama/lmstudio)
- mcp_servers: MCPサーバーの定義
- database: PostgreSQL接続設定
- github/gitlab: プラットフォーム固有の設定
- planning: プランニング機能の設定
- context_storage: コンテキスト管理の設定
- pause_resume: 一時停止・再開機能の設定
- rabbitmq: メッセージキューの設定
- command_executor: コマンド実行環境の設定
- text_editor_mcp: テキストエディタMCPの設定
主要な設定項目は環境変数で上書き可能です:
- TASK_SOURCE: タスクソース
- GITHUB_PERSONAL_ACCESS_TOKEN: GitHub APIトークン
- GITLAB_PERSONAL_ACCESS_TOKEN: GitLab APIトークン
- OPENAI_API_KEY: OpenAI APIキー
- DATABASE_URL: データベース接続URL
- USE_USER_CONFIG_API: ユーザー設定API使用フラグ
- USER_CONFIG_API_URL: ユーザー設定APIURL
- USER_CONFIG_API_KEY: ユーザー設定APIキー
設定ファイルのllm.providerで使用するプロバイダーを指定します:
- openai: OpenAI API(またはOpenAI互換API)
- ollama: Ollama ローカルLLM
- lmstudio: LM Studio ローカルLLMサーバー
LLMClient抽象クラスを定義し、以下のメソッドを実装:
- send_system_prompt: システムプロンプトを送信
- send_user_message: ユーザーメッセージを送信
- get_response: LLMからの応答を取得
- github: GitHub操作用MCPサーバー
- gitlab: GitLab操作用MCPサーバー
- command-executor: コマンド実行用MCPサーバー
- text-editor: ファイル編集用MCPサーバー
MCPサーバーとの通信を担当するクライアント:
- 設定ファイルから複数のMCPサーバーを起動
- LLMからのツール呼び出しを適切なMCPサーバーに転送
- ツール実行結果をLLMに返却
TaskGetterクラスがGitHub/GitLabから以下の条件でタスクを取得:
- 指定されたラベル(デフォルト: "coding agent")が付与されている
- 処理中ラベルが付与されていない
- オープン状態のIssue/PR/MR
Task.prepare()で以下を実行:
- タスクラベルを削除
- 処理中ラベルを付与
- タスク情報をデータベースに登録
TaskHandlerがLLMと対話しながらタスクを実行
PlanningCoordinatorが以下のフェーズで実行:
- 計画前情報収集フェーズ: 依頼内容を理解し、必要な情報を収集
- 計画フェーズ: タスクを段階的に分解し、実行計画を作成
- 実行フェーズ: 計画に従ってアクションを実行
- リフレクションフェーズ: 実行結果を振り返り、問題を検出
- 検証フェーズ: タスク完了後の検証と追加作業の実行
- 再計画フェーズ: 必要に応じて計画を修正
Task.finish()で以下を実行:
- 処理中ラベルを削除
- 完了ラベルを付与
- タスクステータスを更新
タスクのコンテキストをcontexts/ディレクトリに保存:
- running/{uuid}/: 実行中のタスク
- completed/{uuid}/: 完了したタスク
- paused/{uuid}/: 一時停止中のタスク
各タスクディレクトリには以下を保存:
- metadata.json: タスクのメタデータ
- messages.jsonl: 会話履歴
- summaries.jsonl: 圧縮された要約
- planning/: プランニング情報
会話履歴が閾値を超えた場合、古いメッセージを要約して圧縮:
- LLMに要約を依頼
- 古いメッセージを削除
- 要約を履歴の先頭に追加
同一Issue/MR/PRの過去のコンテキストを引き継いで処理の継続性を向上:
- 過去の計画、検証結果、リフレクションを参照
- 成功パターンを再利用
- 有効期限内のコンテキストのみを引き継ぎ
PostgreSQLにタスク情報を永続化:
- tasksテーブル: タスクの状態、統計情報、メタデータを保存
- TaskDBManagerクラスでデータベース操作を抽象化
- SQLAlchemy ORMを使用
ユーザー設定APIで使用(user_config_api/):
- usersテーブル: ユーザー情報
- user_configsテーブル: ユーザーごとのLLM設定
- AES-256-GCMで機密情報を暗号化
contexts/pause_signalファイルを作成すると、次のチェックポイントでタスクを一時停止:
- 現在の状態を保存
- タスクに一時停止ラベルを付与
- プロセスを終了
次回Producer実行時に一時停止タスクをキューに再投入:
- 保存された状態を復元
- 処理を継続
タスクの担当者(assignee)が解除された場合、タスクを停止:
- 処理を中断
- 停止ラベルを付与
- コンテキストを保存
Issueで依頼された内容を自動的にMR/PRとして作成:
- Issueの内容からブランチを作成
- MR/PRを作成(ドラフト状態)
- Issueのコメントを転記
- 処理をMR/PRで継続
Command Executor MCPを使用してDocker環境でコマンドを実行:
- 複数言語対応(Python、Node.js等)
- プロジェクトをクローン
- 依存関係を自動インストール
- コマンドを実行してフィードバックを取得
プランニングフェーズでLLMがプロジェクトに適した実行環境を選択:
- プロジェクトファイルを分析
- 必要な言語・ツールを判定
- 適切な環境イメージを選択
ファイル操作をtext-editor MCPで実行:
- ファイルの表示(view)
- ファイルの新規作成(create)
- 文字列置換による編集(str_replace)
- 行挿入(insert)
- 編集の取り消し(undo_edit)
ファイル変更後はgitコマンドで管理:
git statusで変更確認git addでステージングgit commitでコミットgit pushでプッシュ
Producer、Consumerをそれぞれ別のコンテナとして実行:
- Producer: 定期的にタスクを取得してキューに投入
- Consumer: キューからタスクを取得して処理
- RabbitMQ: タスクキューとして動作
- PostgreSQL: タスク情報を永続化
各コンテナのヘルスチェック機能:
- 定期的にステータスファイルを更新
- 異常検知時に再起動
ユーザーごとの設定をAPIで管理:
- FastAPIでREST API提供
- StreamlitでWeb管理画面提供
- Active Directory認証
- ユーザー管理(追加、編集、削除)
- LLM設定管理(プロバイダー、モデル、APIキー等)
- システムプロンプトのカスタマイズ
- トークン使用量の追跡と表示
タスク実行中の進捗を1つのコメントに集約:
- タスク開始時に進捗コメントを作成
- フェーズ変更、アクション実行時にコメントを更新
- タイムライン形式で経過を記録
計画をMarkdownチェックリストとして表示:
- 各アクションの実行状態を視覚化
- 完了したアクションにチェックマーク
- 進捗率を表示
一時的なエラーに対して自動リトライ:
- HTTP 5xxエラー: 3回リトライ
- ツール実行エラー: 設定に応じてリトライ
失敗時の通知:
- ログに詳細を出力
- Issue/MRにエラーコメントを追加
- エラーメッセージをデータベースに記録
- APIキー、トークンは環境変数で管理
- データベースの機密情報はAES-256-GCMで暗号化
- 設定ファイルに機密情報を含めない
- ユーザー設定APIはBearer認証
- Active Directoryと連携した認証
- 最小権限の原則に従ったトークン管理
- クラス設計
- コンテキストファイル化仕様
- プランニング仕様
- 一時停止・再開仕様
- 再計画仕様
- Issue→MR変換仕様
- コマンド実行環境仕様
- テキストエディタMCP仕様
- ユーザー設定Web仕様
- 進捗コメント更新仕様
- コメント検出仕様
- タスク停止仕様
- トークン使用量追跡仕様
- DB分離設計
- 継続動作モード仕様
- 複数言語環境仕様
- プロジェクトエージェントルール仕様
- コンテキスト引き継ぎ仕様
- 計画前情報収集仕様
- プロジェクトファイル一覧仕様
- 計画実行フェーズ環境設定仕様
文書バージョン: 3.0
最終更新日: 2024-12-07
ステータス: 統合版