FScoward/gensui

★ 0Forks 0RustGitHub ↗Compare

README

Gensui(元帥)

Gensuiは、複数のAIコーディングエージェントを同時に扱うためのTUI(Text User Interface)ベースのマルチワーカー管理ツールです。Issue対応のばらつきやコンテキストスイッチの負担を減らし、定義済みワークフローに沿った自動処理で品質と速度を両立します。

背景と課題

  • 複数Issueを並行していると進捗が散逸しやすい
  • ブラウザやターミナルのタブが増え、現在地が分からなくなる
  • コマンド操作を毎回手で行うのは煩雑
  • 担当者によって対応手順が異なり品質が揺らぐ

ソリューション概要

  • k9s風キーバインドを備えたTUIダッシュボード
  • 各ワーカーを独立したgit worktree上で稼働させてコンフリクトを回避
  • Claude Code / Codex / Cursor / Aiderなど、複数エージェントを並列実行
  • ワークフロー定義に従い、分析→実装→テストといったステップを順番に遂行
  • リアルタイムでステータス・編集中ファイル・トークン使用量・ログを可視化

想定ユースケース

  1. 複数Issueの同時進行: Issueごとにワーカーを割り当て、進捗を一覧で管理
  2. アプローチ比較実験: 同一Issueを複数エージェントで試行しアウトプットを比較
  3. チーム開発の標準化: 担当者ごとの作業をワークフローで統一し品質を平準化

対応エージェント例: Claude Code、OpenAI Codex、Cursor、Aider など。

TUIデザイン

┌─ Gensui [workers] ─────────────────────────────────────────┐
│ NAME      STATUS   ISSUE   AGENT        WORKTREE     BRANCH │
│ worker-1  Running  #123    Claude Code  .wt/wt-1     fix123 │
│ worker-2  Paused   #456    Codex        .wt/wt-2     feat   │
│ ...                                                    ... │
├────────────────────────────────────────────────────────────┤
│ <0> all <1> running <2> paused <3> failed <4> idle          │
│ <enter> view <d> delete <l> logs <p> pause <r> restart <:>  │
└────────────────────────────────────────────────────────────┘
  • メインビュー: ワーカーの一覧・フィルタ・ソート・カラーコード(緑=Running, 黄=Paused, 赤=Failed, 灰=Idle)
  • 詳細ビュー: Issue情報、ブランチ、実行中ステップ、セッションIDなどを表示
  • ログビュー: follow/wrapを備えたリアルタイムログモニタ
  • キーバインド: Enter 詳細、n 新規、p 一時停止、l ログ、: コマンドモード、/ フィルタ、q 終了

ワーカーライフサイクル

  1. Issue番号を指定し、GitHub等からメタ情報を取得
  2. git worktree add .worktrees/wt-{id} -b feature/issue-{number}で専用環境を生成
  3. ベースブランチから新規ブランチを作成してチェックアウト
  4. 選択したエージェントをworktree内でHeadless起動し、Issueテンプレートをプロンプトとして投入
  5. 定義済みワークフローを順次実行し、各ステップの結果をTUIへストリーミング
  6. 正常終了時はworktreeの削除/保持を選択、異常終了時はworktreeを保持してデバッグに備える

エージェント制御アプローチ

アプローチ 概要 長所 短所 用途
Headless CLI (推奨) npx @anthropic-ai/claude-code@latest --output-format stream-jsonなどを外部プロセスとして起動 並行実行とリアルタイム監視に最適、言語自由度が高い プロセス管理とエラーハンドリングが複雑 Gensui本体実装
Agent SDK @anthropic-ai/claude-agent-sdk等でAsyncIteratorを利用 型安全・公式サポート Node.js依存、カスタマイズ性やや低い 追加オプションとして
MCP Server Claude Code内のプラグインとして提供 セットアップ簡単、エディタ統合が容易 独立TUIには不向き、並列性が低い Claude Code拡張用途

GensuiではHeadless CLI方式を標準とし、command-groupでプロセスグルーピング、JSON Lines出力のパース、ANSI除去等でTUIに連携します。

パーミッションと安全性

  • 基本ポリシー: --allowedTools "Read,Write,Edit,Bash,Grep" --permission-mode acceptEdits
  • Sandboxモード: デフォルトで有効。Claude Codeのファイルシステムアクセスをworktree内に制限し、システム全体への予期しない変更を防止
    • 設定方法: .claude/settings.jsonで制御(プロジェクトルートに配置)
    • デフォルト設定:
      {
        "sandbox": {
          "enabled": true,
          "autoAllowBashIfSandboxed": true
        }
      }
    • セキュリティ優先の設計により、デフォルトでsandboxは常に有効
    • 無効化する場合は.claude/settings.local.jsonで"enabled": falseを設定(非推奨)
  • .claude/settings.jsonでプロジェクト固有ルールをホワイトリスト/ブラックリスト管理
  • 機密ファイル (.env, secrets/**) へのアクセスは明示的に拒否
  • 危険コマンド (rm, curlなど) は許可制。実行前に差分やコマンドを確認するガードを実装
  • Enterprise → プロジェクト共有 → ローカル → ユーザー設定の優先順位で適用
  • Claude Codeからツール使用権限が要求されるたびにTUI上へモーダルを表示し、←/→で選択・Enter/Yで許可・Esc/Nで拒否できるフローを実装。応答内容はワーカーログとアクションログに記録されます。

セッション / コンテキスト管理

  • セッション履歴の自動記録: Claude Code実行時のすべてのイベント(ツール使用、メッセージ、思考プロセス、結果)を構造化して保存
  • セッションIDの管理: session_idを自動取得・保存し、--continueで同一セッションを継続
  • 詳細な履歴追跡:
    • ツール使用履歴(Read/Write/Edit/Bashなど)
    • 編集されたファイル一覧
    • Claudeの思考プロセス(Thinking Blocks)
    • エラーと結果の完全な記録
  • 永続化: .gensui/state/workers/*.jsonにセッション履歴を保存し、再起動後も復元
  • worktreeごとに.sessionとCLAUDE.mdを配置し、永続コンテキストとターン数を追跡
  • ターン数やトークン使用量が閾値を超えたら警告し、/compactなどの圧縮コマンドを推奨

技術スタック候補

  • 言語: RustまたはGo(並行処理とパフォーマンス重視)
  • TUI: Rustならratatui、Goならtview/bubbletea
  • Git操作: git2クレート/git CLIラッパ
  • 非同期I/O: Rust tokio、Go goroutine
  • 設定: YAML/TOMLでワークフロー定義、.claudeディレクトリにセッション情報を保存

実装ロードマップ

  • Phase 1 (MVP): メインTUI、ワーカー作成/削除、worktree自動化、Claude Code対応
  • Phase 2: 詳細/ログビュー、複数エージェント対応、ワークフロー定義、検索・フィルタ機能
  • Phase 3: CPU/メモリ/トークン監視、自動リトライ、メトリクス分析、プラグイン拡張

関連プロジェクトからの学び

  • Vibe Kanban (Rust + React): command-groupによるプロセス制御、非同期ストリーム処理、エージェントプロファイル管理、git自動化
  • Claude Task Master (TypeScript): Agent SDK + MCP統合、PRD解析によるタスク自動生成、マルチプロバイダー抽象化

これらのベストプラクティスを取り込みつつ、GensuiはTUI特化・git worktree連携・リアルタイム監視で差別化を図ります。

次のステップ

  • Rust + ratatuiでのプロトタイプ実装
  • worktree管理ライブラリ/ラッパの整備
  • Claude Code Headless制御用モジュール作成
  • 基本ワークフロー(分析→実装→テスト)をテンプレート化
  • 早期ユーザーフィードバックの収集と設計改善

Gensuiによって、AIエージェントを活用したマルチIssue処理を安全かつ効率的に進めましょう。

MVPプロトタイプの起動方法

開発用の最小構成TUIを用意しました。cargo runで起動すると、実際にgit worktreeを作成/削除しながら、簡易的なエージェント処理(シミュレーション)とログストリームを確認できます。

実行

cargo run

キーバインド

  • q: アプリケーション終了
  • c: 新しいワーカーのプロビジョンを実行(git worktree追加+エージェント起動)
  • d: 選択中のワーカーを削除
  • r: 選択中ワーカーを再起動(ワークフローを再実行)
  • a: ステータスフィルタを循環(All → Running → Paused → Failed → Idle → All)
  • w: 利用するワークフローを切り替え(workflows.jsonで定義)
  • i: 自由指示を入力し、そのままClaudeに送信
  • j / k または ↑ / ↓: 行の移動
  • l: アクションログのモーダル表示切り替え
  • h: ヘルプモーダル表示切り替え
  • Shift+C: ログを圧縮(古いログを上限4件まで削除)

ワークフロー設定

リポジトリ直下のworkflows.jsonからワークフローを読み込みます。ファイルが存在しない・空の場合はデフォルトの3ステップ(分析→実装→テスト)が自動挿入されます。

{
  "default_workflow": "default",
  "workflows": [
    {
      "name": "default",
      "description": "分析→実装→テストの標準フロー",
      "steps": [
        { "name": "分析", "command": "echo '[分析] Issueを解析しています'" },
        { "name": "実装", "command": "echo '[実装] 変更を適用中'" },
        { "name": "テスト", "command": "echo '[テスト] テストを実行中'" }
      ]
    }
  ]
}

ヘッダ/フッタに現在選択中のワークフロー名が表示され、wキーで順次切り替え可能です。ワーカー作成時には選択中のワークフローが適用され、各ステップのコマンド実行ログがLogsモーダルから確認できます。

Claude Code連携

ステップにclaudeブロックを定義すると、Claude Code CLIをheadless実行します。CLIへのパスは環境変数GENSUI_CLAUDE_BIN(デフォルト: claude)で指定します。例:

{
  "name": "Claude分析",
  "description": "Claude CodeにIssueの影響範囲をまとめさせる",
  "claude": {
    "prompt": "Issue {{issue}} について、影響範囲と懸念点を3点以内でまとめてください。",
    "model": "sonnet",
    "permission_mode": "plan",
    "allowed_tools": [],
    "extra_args": ["--max-output-tokens", "800"]
  }
}
Sandboxモードの設定

デフォルトではすべてのClaude Codeステップでsandboxモードが有効です。Sandboxingは.claude/settings.jsonで制御します。

プロジェクトルートに.claude/settings.jsonを配置することで、すべてのClaude Code実行に適用されます:

{
  "sandbox": {
    "enabled": true,
    "autoAllowBashIfSandboxed": true
  }
}

Sandboxを無効化する必要がある場合(非推奨)、.claude/settings.local.jsonで上書きできます:

{
  "sandbox": {
    "enabled": false
  }
}

注意: .claude/settings.local.jsonは個人用設定ファイルで、gitにコミットされません。チーム全体のセキュリティポリシーは.claude/settings.jsonで管理してください。

テンプレートでは{{issue}}、{{branch}}、{{worktree}}、{{worker}}が利用できます。extra_argsはCLI引数をそのまま追加し、{{prompt}}や{{workdir}}プレースホルダを埋め込みます。

⚠️ Claude CLIのバージョンによりフラグ名が異なる場合があります。必要に応じてextra_args側でフル引数を指定してください。非ゼロ終了の場合はステップがFailedとなり、stderr/stdoutをログに記録します。

ℹ️ .gensui/state/ 以下にワーカー状態とアクションログをJSONで保存します。再起動すると直近64件のアクションログと各ワーカーのステップ履歴が復元されます。

今後の発展余地

  • App::on_tick内で実ワーカーのポーリングと状態更新を実装
  • 実エージェント(Claude Code等)の出力をストリーミングし、ログビューに反映
  • Action Logを永続化し、セッション再開時の履歴を復元
  • ワークフロー定義に応じた前後処理(例: Issueメタ情報の取得、テストカバレッジ収集)

Contributors

FScowardclaude

Issues